带有引号的ssh命令


11

我有一个奇怪的错误,就是我找不到任何东西。我想使用以下命令更改用户注释。

$ sudo usermod -c "New Comment" user

这将在登录到服务器时起作用,但我想在20多个服务器上实现自动化。通常,我能够使用列表并遍历服务器并运行命令,但在这种情况下会出现错误。

$ for i in `cat servlist` ; do echo $i ; ssh $i sudo usermod -c "New Comment" user ; done 
serv1
Usage: usermod [options] LOGIN

Options:
lists usermod options

serv2
Usage: usermod [options] LOGIN

Options:
lists usermod options
.
.
.

当我运行此循环时,它会抛出错误,就像我不正确地使用该命令一样,但是它将在单个服务器上正常运行。

在ssh手册页中浏览时,我确实尝试过-t并进行-t -t标记,但是这些无效。

我已经perl -p -i -e在类似的循环中成功使用过编辑文件。

有谁知道我无法循环播放的原因?

Answers:


6
for i in `cat servlist`;do echo $i;ssh $i 'sudo usermod -c "New Comment" user';done

要么

for i in `cat servlist`;do echo $i;ssh $i "sudo usermod -c \"New Comment\" user";done

14

SSH在Shell中执行远程命令。它将字符串传递给远程外壳程序,而不是参数列表。传递给ssh命令的参数之间用空格连接。的参数sshsudousermod-cNew Commentuser,所以远程外壳看到命令

sudo usermod -c New Comment user

usermod解析Comment为用户名和user虚假额外参数。

您需要将引号传递给远程外壳程序,以便将注释视为字符串。最简单的方法是将整个远程命令放在单引号中。如果在该命令中需要单引号,请使用'\''

ssh "$i" 'sudo usermod -c "Jack O'\''Brian" user'

与其调用ssh循环并忽略错误,不如使用一种设计用于在多个服务器(例如pssh,mussh,clustersh等等)上运行命令的工具。请参阅在许多服务器上通过SSH自动运行命令

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.