передача значения bash на удаленный сервер

#linux #bash #ssh #server #script

#линукс #удар #тсс #сервер #скрипт

Вопрос:

у нас есть список серверов и локальных пользователей в текстовом файле. нам нужно регулярно менять эти пароли.

 cat host.txt user1@server_test user2@server_test usera@server_dev userb@server_dev usera1@server_pro userb1@server_pro  

Я написал следующий скрипт для смены пароля

 #!/bin/bash for i in $(cat host.txt); do  userid=`echo $i | awk -F"@" '{print $1}'`  server=`echo $i | awk -F"@" '{print $2}'`  ssh $server 'echo -e "tempP@assntempP@ass" | sudo passwd `echo $userid`' done  

проблема с этим скриптом: на удаленном сервере значение переменной $userid не видно (я знаю причину) каков наилучший способ передачи этого значения на удаленный сервер?

Комментарии:

1. Зачем вы echo вообще пользуетесь? Вместо того, чтобы бегать echo $userid по обратным ссылкам, просто пишите $userid . Но если вы хотите расширить это на локальном хосте, вы не можете использовать одинарные кавычки.

Ответ №1:

Я не уверен в вашем вопросе; похоже, вы должны беспокоиться о том, чтобы пароль был виден противникам на удаленном устройстве, но, похоже, ваша проблема заключается просто в том, что расширение $userid не удалось . Я верю, что ты просто хочешь:

 #!/bin/bash while IFS=@ read userid server; do  ssh "$server" "printf 'tempP@assntempP@assn' | sudo passwd $userid" done lt; host.txt  

Как упоминалось ранее, это ужасно небезопасно, так как пароли будут видны на пульте дистанционного управления. Вы можете смягчить это с помощью:

 #!/bin/bash while IFS=@ read userid server; do  printf 'tempP@assntempP@assn' | ssh "$server" "sudo passwd $userid" done lt; host.txt  

Комментарии:

1. Спасибо, что он работает

2. Привет, Уильям, нам нужна небольшая корректировка, как я могу поставить условие типа «если [ ‘uname-s’ == Linux ] тогда; выполните команду 1, иначе выполните команду 2 fi»

3. Вы пытаетесь запустить uname на пульте дистанционного управления? Вам следует избегать слишком большой сложности в скрипте оболочки , через который вы проходите ssh , но в принципе вы можете делать именно то, что описываете: ssh "$server" 'if test "$(uname -s)" = Linux; then sudo passwd '"$userid"' ..; fi' . Просто убедитесь, что $userid это не защищено одинарной кавычкой, так как вы хотите, чтобы она была интерполирована.

Ответ №2:

Я бы использовал chpasswd

 #!/bin/bash for i in $(cat host.txt); do  userid="`echo $i | awk -F"@" '{print $1}'`"  server="`echo $i | awk -F"@" '{print $2}'`"  # ssh root@$server -t "echo $userid:tempP@ass|chpasswd"  # or as suggested by @chepner  echo "$userid:tempP@ass" |ssh root@$server -t chpasswd done  

От man 8 chpasswd :

Команда chpasswd считывает список пар имени пользователя и пароля из стандартного ввода и использует эту информацию для обновления группы существующих пользователей. Каждая строка имеет формат:

имя пользователя:пароль

Комментарии:

1. Также передайте новый пароль ssh , а не делайте его видимым в удаленной командной строке. echo ... | ssh root@$server -t chpasswd