#linux #shell
#linux #оболочка
Вопрос:
Я новичок в написании сценариев оболочки Linux.Мне нужно выполнить сценарий оболочки, который получает имя пользователя, пароль, имя хоста, команду, подлежащую выполнению, в качестве параметров 1,2,3,4 соответственно. Я использовал ssh, но он запрашивает пароль. Основная тема этого скрипта — выполнить команду с удаленного сервера. Проблемы с безопасностью паролей не являются проблемой. Основная проблема заключается в том, что мне не должно быть предложено ввести пароль. Пожалуйста, помогите мне решить эту проблему.
echo username = $1
echo Password = $2
echo Host-Name = $3
echo Command to Be executed = $4
set -x
expect -c "spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no $1@$3 $4; expect "*assword:*"; send "$2r";expect eof;"
echo "==============="
Мой вывод:
username = root
Password = root@123
Host-Name = host-name
Command to Be executed = ls
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no root@host-name ls
root@123r===============
Моя команда, т.е. Вывод ls, не отображается.
После использования set -x перед ожидаемой командой:
Вывод:
username = root
Password = root@123
Host-Name = host-name
Command to Be executed = ls
expect -c 'spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no root@host-name ls; expect "*assword:*"; send root@123r;expect eof;'
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no root@host-name ls
root@123r echo
===============
===============
printf '33]0;%s@%s:%s07' root RHEL5 '~'
Комментарии:
1. Вы можете использовать аутентификацию без пароля (на основе ключа). Или вы можете попытаться
expect
ввести пароль.2. как поступить с ожидаемой командой? Я обновил свой вопрос, пожалуйста, предложите
3. пожалуйста, любые предложения.
4. Добавьте escape
"
-символ перед отправкой. Примерsend "$2r"
Примите ответ, если он работает для вас.
Ответ №1:
Вы можете использовать следующую команду командной строки:
expect -c 'spawn ssh USERNAME@SERVER; expect password:; send "PASSWORDn"; interact'
Возможно, у вас его нет expect
в вашей системе Linux, но я думаю, вы можете легко его установить.
Ответ №2:
Попробуйте это:
echo username = $1
echo Password = $2
echo IP-Address= $3
echo Command to be executed= $4
expect -c "spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no $1@$3 $4; expect "*assword:*"; send $2r; expect eof"
А для входа в систему на основе ключа перейдите по этой ссылке. Для этого вам необходимо сгенерировать открытый и закрытый ключи с пустой парольной фразой. И добавьте свой открытый ключ к удаленным машинам USER/.ssh/authorized_keys .
Комментарии:
1. Я не получаю желаемый результат. Он отображает имя пользователя = пароль root = root @123 Имя хоста = имя хоста spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=нет root@host-name ls root@123 ===============
2. У меня работает тот же сценарий. Я получаю
ls
вывод. Не могли бы вы опубликовать полный журнал ошибок?3. Ошибка не появляется. Он просто выходит из скрипта в командный режим
4. Понятия не имею. Вы уверены, что ваш ssh работает? Сначала попробуйте вручную. Добавьте
set -x
в начале и предоставьте результат.5. Я вижу, что
r
этого не хватаетsend PASSOWRDr
. Пожалуйста, обновите свой скрипт.
Ответ №3:
Это работает для меня:
expect -c "spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no $1@$3 $4; expect "*assword:*"; send "$2r";expect eof;"