如何为远程rsync进程设置环境变量?


12

当我使用rsync将文件从一台计算机复制到另一台计算机时,两端都会启动rsync进程。但是,在远程端,外壳初始化文件显然没有被读取,因此我无法为远程rsync进程设置环境变量。不幸的是,我需要将一台服务器rsync到其上,rsync需要一个环境变量才能正常工作。我不是服务器上的管理员,因此无法更改全局配置。如何为远程rsync进程设置环境变量?


如何在服务器上启动rsync进程?您可以通过ssh触发脚本吗?
kraftan

完成后rsync localfilename remotehost:remotefilename,rsync进程将在服务器上启动。我不确定如何,但是它不读取任何外壳初始化文件。
瑞安·汤普森

Answers:


20

~/.profilessh somecommand与交互式ssh会话(或在其中启动交互式会话的其他登录方法)相反,在运行时通常不会读取。

Ssh支持发送环境变量。在OpenSSH中,使用中的SendEnv指令~/.ssh/config。但是,必须AcceptEnv服务器配置中使用指令启用特定的环境变量,因此这可能对您不可行。

OpenSSH还允许在服务器端设置环境变量。同样,必须在服务器配置中启用此功能,此处使用PermitUserEnvironment指令。可以在文件中设置变量~/.ssh/environment。假设您使用公共密钥身份验证,还可以在相关行的开头的~/.ssh/authorized_keys:add environment="FOO=bar"中设置每个密钥的变量。

有一两件事,我认为始终工作(奇怪的是),只要你使用公钥认证是(AB)使用command=选项authorized_keys的文件。带command选项的键仅适用于运行指定的命令。但是authorized_keys文件中的命令运行时环境变量SSH_ORIGINAL_COMMAND设置为用户指定的命令(对于交互式会话为空)。因此,您可以在其中使用类似这样的东西~/.ssh/authorized_keys(当然,如果您不使用此密钥进行身份验证,那么它将不适用):

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

请注意,为了清晰起见,我在上面放置了换行符,但这实际上需要全部放在一行上。

另一种可能性是~/bin/rsync-wrapper在服务器上编写包装器脚本,例如

#!/bin/sh
. ~/.profile
exec rsync "$@"

然后通过--rsync-path='bin/rsync-wrapper'接通rsync命令行。的参数--rsync-path由外壳扩展,因此,如果您愿意,可以通过传递类似的内容使rsync命令行独立--rsync-path='. ~/.profile; rsync'

还有另一种方法,这取决于您的登录shell是bash还是zsh。Bash总是~/.bashrc在rshd或sshd调用时读取,即使它不是交互式的(但如果调用为sh)也不是。Zsh总是读取~/.zshenv

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

好吧,几乎可以总结一下。我希望有比使用包装脚本更好的方法。
瑞安·汤普森

等一下 如果没有读取我的shell初始化文件,它甚至如何在服务器上找到rsync二进制文件?我安装在〜/ usr中,这是一个非标准位置,必须$PATH在我的shell初始化脚本中添加到我的位置。
瑞安·汤普森

@Ryan:我实际上忘记了最直接的方法(请参阅我的编辑),但是它也需要在服务器配置中启用指令。如果您找到了一种考虑您的方法PATH,则应该能够在那里设置任何其他变量。(如果这样不起作用,请从set -x任何shell脚本开始尝试添加尽可能多的跟踪;用rsync将环境转储到文件的包装器脚本替换二进制文件,然后调用真实的二进制文件。)
Gilles'SO -停止作恶

~/.ssh/rc
瑞安·汤普森

@Ryan:~/.ssh/rc由单独的shell进程执行。我认为您最好的选择是包装脚本或--rsync-path='. ~/.profile; rsync'。或rsync根据其他问题使用合适的rpath 重新编译。
吉尔斯(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.