命令中的某些输出丢失传递给SSH

时间:2017-12-07 19:23:52

标签: bash ssh parameter-expansion

我正在尝试使用ssh命令ssh到服务器并运行我传递给它的useradd命令。似乎它在大多数情况下运行正常(没有错误产生)但是/etc/shadow文件中的哈希密码缺少盐(我相信这是缺少的部分。 )。

我不确定引用是否不正确。但是在服务器上手动运行此命令工作正常,所以我假设它的扩展已经搞砸了。?

以下命令在Bash脚本中运行...

命令:

ssh user@$host "useradd -d /usr/local/nagios -p $(perl -e 'print crypt("mypassword", "\$6\$salt");') -g nagios nagios && chown -R nagios:nagios /usr/local/nagios"

*当我在perl one-liner中转义双引号时,我收到错误:

  

在-e第1行的EOF之前的任何地方找不到字符串终结符“

     

用法:useradd [options] LOGIN

知道我在这里做错了吗?

2 个答案:

答案 0 :(得分:1)

不是将整个命令括在双引号中并确保正确地转义其中的所有内容,而是使用单引号更加健壮,并根据需要处理嵌入的单引号。 事实上,没有嵌入的单引号要处理, 只有$中的嵌入式文字$6$salt

ssh "user@$host" 'useradd -d /usr/local/nagios -p $(perl -e "print crypt(q{mypassword}, q{\$6\$salt});") -g nagios nagios && chown -R nagios:nagios /usr/local/nagios'

答案 1 :(得分:0)

echo "useradd -d /usr/local/nagios -p $(perl -e 'print crypt("mypassword", "\$6\$salt");') -g nagios nagios && chown -R nagios:nagios /usr/local/nagios" > /tmp/tempcommand && scp /tmp/tempcommand root@server1:/tmp && ssh server1 "sh -x /tmp/tempcommand && finger nagios && rm /tmp/tempcommand"

在这种情况下,我总是希望在本地/远程服务器上有一个本地文件,我可以从中执行命令集。节省了很多“报价调试时间”。我上面所做的是首先将本地长文件保存到文件中,“按原样”和“在本地工作”,用scp将其复制到远程服务器并在shell中执行。 更安全的方式(无需复制文件)。再次 - 在本地保存并使用-s选项将其传递给远程bash:

echo "useradd -d /usr/local/nagios -p $(perl -e 'print crypt("mypassword", "\$6\$salt");') -g nagios nagios && chown -R nagios:nagios /usr/local/nagios" > /tmp/tempcommand && echo finger nagios >> /tmp/tempcommand && ssh server1 'bash -s' < /tmp/tempcommand