введите пароль в command и выполните

#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;"