Rya*_*son 12 ssh rsync environment-variables remote-connection
当我使用 rsync 将文件从一台计算机复制到另一台计算机时,两端都会启动一个 rsync 进程。但是,在远程端,shell 初始化文件显然没有被读取,因此我无法为远程 rsync 进程设置环境变量。不幸的是,我需要在一台服务器上进行 rsync,rsync 需要一个环境变量才能工作。我不是服务器上的管理员,因此无法更改全局配置。如何为远程 rsync 进程设置环境变量?
Gil*_*il' 21
~/.profilessh somecommand与交互式 ssh 会话(或启动交互式会话的其他登录方法)相反,运行时通常不会读取。
ssh 支持发送环境变量。在OpenSSH的,使用SendEnv的指令~/.ssh/config。但是,必须使用服务器配置中的AcceptEnv指令启用特定的环境变量,因此这可能对您不起作用。
OpenSSH 还允许在服务器端设置环境变量。同样,这必须在服务器配置中启用,这里使用PermitUserEnvironment指令。可以在文件中设置变量~/.ssh/environment。假设您使用公钥身份验证,您还可以在相关行的开头~/.ssh/authorized_keys添加 : addenvironment="FOO=bar"中的per-key 变量。
有一两件事,我认为始终工作(奇怪的是),只要你使用公钥认证是(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 …
Run Code Online (Sandbox Code Playgroud)
请注意,为了便于阅读,我在上面放置了换行符,但这实际上需要全部在一行上。
另一种可能性是~/bin/rsync-wrapper在服务器上编写一个包装脚本,例如
#!/bin/sh
. ~/.profile
exec rsync "$@"
Run Code Online (Sandbox Code Playgroud)
然后通过--rsync-path='bin/rsync-wrapper'接通rsync命令行。参数--rsync-path由 shell 扩展,因此如果您愿意,可以通过传递类似--rsync-path='. ~/.profile; rsync'.
还有另一种途径取决于您的登录 shell 是 bash 还是 zsh。Bash 总是~/.bashrc在被 rshd 或 sshd 调用时读取,即使它不是交互式的(但如果它被称为 as 则不会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
Run Code Online (Sandbox Code Playgroud)