在远程ssh命令中传递变量

Fer*_*gal 84 linux ssh bash shell

我希望能够使用ssh从我的机器运行命令并传递环境变量 $BUILD_NUMBER

这是我正在尝试的:

ssh pvt@192.168.1.133 '~/tools/myScript.pl $BUILD_NUMBER'
Run Code Online (Sandbox Code Playgroud)

$BUILD_NUMBER 在进行ssh调用的机器上设置,因为远程主机上不存在该变量,所以它不会被拾取.

我如何传递值$BUILD_NUMBER

sar*_*old 161

如果你使用

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
Run Code Online (Sandbox Code Playgroud)

代替

ssh pvt@192.168.1.133 '~/tools/run_pvt.pl $BUILD_NUMBER'
Run Code Online (Sandbox Code Playgroud)

$BUILD_NUMBER在将命令字符串发送到远程主机之前,shell会插入内插.

  • 如果某人必须使用单引号,以便引号中包含的命令不在本地评估,那么他们应该使用"'$ VARIABLE'".示例:ssh pvt@192.168.1.133'~/ tools/run_pvt.pl"'$ BUILD_NUMBER'"' (6认同)
  • linux 核心开发人员必须在地狱中燃烧 (3认同)
  • PSA:如果您的字符串包含用户输入,这是一个非常糟糕的主意,并且可能使您容易遭受代码注入攻击。 (3认同)
  • 不知道bash对单引号和双引号的反应不同.谢谢! (2认同)

Ste*_*hen 26

不评估单引号中的变量.使用双引号:

ssh pvt@192.168.1.133 "~/tools/run_pvt.pl $BUILD_NUMBER"
Run Code Online (Sandbox Code Playgroud)

shell将使用双引号扩展变量,但不能用单引号扩展变量.在传递给ssh命令之前,这将更改为您想要的字符串.


Ale*_*ies 5

默认情况下,SSHD 上接受的环境变量列表包括LC_*. 因此:

LC_MY_BUILDN="1.2.3" ssh -o "SendEnv LC_MY_BUILDN" ssh-host 'echo $LC_MY_BUILDN'
1.2.3
Run Code Online (Sandbox Code Playgroud)

  • 引用[sshd_conf手册](https://man7.org/linux/man-pages/man5/sshd_config.5.html),“默认是不接受任何环境变量。” 似乎有些 Linux 发行版将“AcceptEnv LANG LC_*”添加到默认配置中,但我不会依赖于此。 (2认同)