-2

我正在尝试使用 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 [选项] LOGIN

知道我在这里做错了什么吗?

4

2 回答 2

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'
于 2017-12-07T19:31:49.803 回答
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
于 2017-12-07T22:57:14.173 回答