команда 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в аналогичном цикле для редактирования файлов.

Кто-нибудь знает причину, я не могу зациклить это?

SpruceTips
источник

Ответы:

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 выполняет удаленную команду в оболочке. Он передает строку в удаленную оболочку, а не список аргументов. Аргументы, которые вы передаете sshкомандам, объединяются с пробелами между ними. Аргументы в sshявляются sudo, usermod, -c, New Commentи user, таким образом , удаленной оболочки видит команду

sudo usermod -c New Comment user

usermodанализирует Commentкак имя пользователя и userкак ложный дополнительный параметр.

Вам необходимо передать кавычки удаленной оболочке, чтобы комментарий обрабатывался как строка. Самый простой способ - поместить всю удаленную команду в одинарные кавычки. Если вам нужна одинарная кавычка в этой команде, используйте '\''.

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

Вместо того, чтобы вызывать sshцикл и игнорировать ошибки, используйте инструмент, предназначенный для запуска команд на нескольких серверах, таких как pssh, mussh, clusterssh и т. Д. См. Автоматический запуск команд через SSH на многих серверах.

Жиль "ТАК - перестань быть злым"
источник