~/.profile
ssh 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