Команда ssh с кавычками

У меня есть странная ошибка, что я не смог найти что-либо на этом. Я хотел изменить комментарий пользователя с помощью следующей команды.

$ 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 man, я попробовал -t и -t -t флаги, но они не сработали.

Я успешно использовал perl -p -i -e в подобном цикле для редактирования файлов.

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

 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 

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 на многих серверах»