我正在尝试使用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
知道我在这里做错了吗?
答案 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