#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