远程SSH会话中的变量

时间:2017-01-03 17:31:17

标签: bash ssh scripting

我的bash脚本中有一些不一致的行为。 有变量,并且所有变量都赋值给它们,我通过回显脚本开头的值来确认它们。

但是,将它们传递给远程SSH会话时,一个变量具有值,而另一个变量显示为空白。我很确定我没有覆盖变量的值。

var s1 = "My String";
s1.endsWith("ring"); // returns true;
s1.endsWith("deez"); //returns false;

因此,# Script input arguments USER=$1 SERVER=$2 # Other vars PFX=$8 # ADDRESS=$USER@$SERVER function run { ssh $ADDRESS /bin/bash $@ } # Script body, some stuff happens here run << "SSHCONNECTION2" sudo mv "/home/$USER/$PFX" "/home/$USER/certs/" SSHCONNECTION2 的输出是

  

错误03-Jan-2017 17:20:39 mv:无法移动&#39; / home / admin /&#39;到自己的子目录,&#39; / home / admin / certs / admin&#39;

有人能给我一个暗示我做错了什么吗? 谢谢。

1 个答案:

答案 0 :(得分:1)

USER有一个远程值,因为USER 总是有一个值:默认情况下,它是all POSIX systems上的当前用户帐户。为了避免与系统定义的变量名冲突,您应该为自己的shell和环境变量使用小写名称(前者是因为设置一个名称与环境变量重叠的shell变量将隐式覆盖后者)。

#!/bin/bash
#      ^^^^ - not /bin/sh; printf %q (thus, eval-safe quoting) is a bash extension

user=$1
pfx=$8

# Tell the shell to quote your variables to be eval-safe!
printf -v user_q '%q' "$user"
printf -v pfx_q '%q' "$pfx"

# ...then you can use those eval-safe version in your heredoc
run << SSHCONNECTION2
    # because the values are self-quoted, don't put their expansions inside quotes
    sudo mv /home/$user_q/$pfx_q /home/$user_q/certs/
SSHCONNECTION2

注意:

  • sigil(SSHCONNECTION2)故意不加引号以允许扩展。
  • 使用小写变量名称可避免无意中与对shell或系统有意义的名称冲突。

上面有点不幸,因为SSHCONNECTION2 heredoc的文字内容不是可以安全直接在shell中运行的代码。考虑this answer instead