当我ssh
进入服务器时,如何将环境变量从客户端传递到服务器?此环境变量在ssh的不同调用之间变化,因此我不想$HOME/.ssh2/environment
每次执行ssh调用时都覆盖它。我怎样才能做到这一点?
ssh
手册页上,除了您修改〜/ .ssh2 / environment之外,除了登录后手动设置变量外,我看不到其他方法。
当我ssh
进入服务器时,如何将环境变量从客户端传递到服务器?此环境变量在ssh的不同调用之间变化,因此我不想$HOME/.ssh2/environment
每次执行ssh调用时都覆盖它。我怎样才能做到这一点?
ssh
手册页上,除了您修改〜/ .ssh2 / environment之外,除了登录后手动设置变量外,我看不到其他方法。
Answers:
当然,您可以在命令中设置环境变量,但是在引用时要格外小心:请记住,您的外壳程序将解析本地命令行,然后远程外壳程序将在其字符串上使用go收到。
如果希望变量在服务器上获得与客户端上相同的值,请尝试以下SendEnv
选项:
ssh -o SendEnv = MYVAR server.example.com mycommand
不过,这需要服务器的支持。使用OpenSSH,必须在中授权变量名/etc/sshd_config
。
如果服务器仅允许使用某些特定的变量名,则可以解决该问题。例如,通用设置允许LC_*
通过,您可以执行以下操作:
ssh -o SendEnv = LC_MYVAR server.example.com'MYVAR = $ LC_MYVAR; 未设置LC_MYVAR; 出口MYVAR;我的命令”
如果甚至LC_*
都不选择,则可以在TERM
环境变量中传递信息,该信息始终被复制(但是可能存在长度限制)。您仍然必须确保远程外壳程序不会将TERM
变量限制为指定已知的终端类型。-t
如果您不启动远程交互式Shell,请将选项传递给ssh。
env TERM =“额外信息:$ TERM” ssh -t server.example.com'MYVAR = $ {TERM%:*}; TERM = $ {TERM ## *:}; 出口MYVAR;我的命令”
另一种可能性是直接在命令中定义变量:
ssh -t server.example.com'导出MYVAR =“额外信息”; 我的命令”
因此,如果传递局部变量:
ssh -t server.example.com'导出MYVAR ='“'$ LOCALVAR'”'; 我的命令”
但是,请注意引号问题:变量的值将直接插值到在远程端执行的shell代码段中。上面的最后一个示例假定$LOCALVAR
不包含任何单引号('
)。
AcceptEnv
指令sshd_config
。但TERM
据我所知,这是经过特殊处理的,据我所知,无法在服务器端对其进行过滤(无论在任何配置设置下,它都是在Shell的环境中设置的)。您确定没有配置文件脚本覆盖它(例如/etc/profile
或~/.profile
或~/.bashrc
)吗?
TERM
仅当客户端请求服务器分配tty时才发送该消息。如果远程没有终端,则传输将毫无用处TERM
。指定命令时,如果要在远程端安装终端,则需要使用-t
命令行选项(或RequestTTY
中的~/.ssh/config
)。
如果可以管理目标主机,则可以配置sshd以允许将本地环境变量传递到目标主机。
在sshd_config手册页中:
PermitUserEnvironment
Specifies whether ~/.ssh/environment and environment= options in
~/.ssh/authorized_keys are processed by sshd. The default is
"no". Enabling environment processing may enable users to bypass
access restrictions in some configurations using mechanisms such
as LD_PRELOAD.
sshd配置通常位于 /etc/ssh/sshd_config
因此,在您的客户端上,您有一些环境变量,并且您希望该变量可用于远程命令吗?我认为没有办法让ssh神奇地传递它,但是您可能可以做这样的事情。而不是使用,说:
ssh remote.host my_command
你可以这样做:
ssh remote.host env ENV_VAR=$ENV_VAR my_command
@emptyset的响应(对我不起作用)使我得到以下答案:
您可以将此命令添加到~/.ssh/authorized_keys
文件中:
command="/usr/bin/env VARIABLE=<something> $SHELL" ssh-rsa <key>
export VARIABLE=<something>
立即退出,并且SSH连接已关闭(将我锁定在服务器之外),而/usr/bin/env ... $SHELL
将在修改后的环境下运行您的默认Shell。
$SHELL
实际的外壳代替?还要检查服务器上是否存在/ usr / bin / env。但是,该解决方案并不完美:我注意到当我想使用scp
或使用内联命令时,它会挂起。
PermitUserEnvironment yes
并使用environment="..."
代替command="..."
。
假设您具有无密码的ssh登录设置,则可以尝试调用自定义命令。在服务器上,编辑与客户端密钥相对应的〜/ .ssh / authorized_keys条目:
command="export VARIABLE=<something>" ssh-rsa <key>
有关更多详细信息,请参阅“ 强制命令 ”部分中的此链接。
我正在为在主目录和/ etc中带有cramfs的设备进行OpenSSH的自定义构建,因此,如果不重建整个FS,〜/ .ssh / environment将无法正常工作,并且这些文件已在现场部署设备(嵌入式系统,因此使用CRAMFS)。您可以在sshd_config中指定authroized_keys文件的位置,但是由于某些原因,environment =仅适用于〜/ .ssh / authroized_keys中的环境变量。编辑/ etc / profile不是一个选择,我不得不将ssh加载到非标准目录中。在session.c中child_set_env(...“ MAIL” ...)之后,只需添加您需要的环境变量(这是我所知道的一种技巧...),但是如果有人在会话中需要一些硬编码的env,从源代码编译,您可以执行此操作。TGI牙线