Автоматически вводить пароль SSH с помощью script
Мне нужно создать script, который автоматически вводит пароль для клиента OpenSSH ssh
.
Скажем, мне нужно SSH в [email protected]
с паролем a1234b
.
Я уже пробовал...
#~/bin/myssh.sh
ssh [email protected]
a1234b
... но это не работает.
Как я могу получить эту функциональность в script?
Ответы
Ответ 1
Сначала вам нужно установить sshpass.
- Ubuntu/Debian:
apt-get install sshpass
- Fedora/CentOS:
yum install sshpass
- Arch:
pacman -S sshpass
Пример:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no [email protected]_SITE.COM
Пример пользовательского порта:
sshpass -p "YOUR_PASSWORD" ssh -o StrictHostKeyChecking=no [email protected]_SITE.COM:2400
Заметки:
-
sshpass
также может считывать пароль из файла, когда -f
флаг -f
. - Использование
-f
предотвращает -f
пароля, если команда ps
выполнена. - Файл, в котором хранится пароль, должен иметь защищенные разрешения.
Ответ 2
После поиска ответа на вопрос в течение нескольких месяцев, я наконец нашел лучшее решение: написание простого скрипта.
#!/usr/bin/expect
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
eval spawn $cmd
expect "assword:"
send "$password\r";
interact
Поместите его в /usr/bin/exp
, затем вы можете использовать:
-
exp <password> ssh <anything>
-
exp <password> scp <anysrc> <anydst>
Готово!
Ответ 3
Использовать аутентификацию открытого ключа: https://help.ubuntu.com/community/SSH/OpenSSH/Keys
В исходном хосте запускайте это только один раз:
ssh-keygen -t rsa # ENTER to every field
ssh-copy-id [email protected]
Что все, после этого вы сможете сделать ssh без пароля.
Ответ 4
Вы можете использовать сценарий ожиданий. Я не написал один за довольно долгое время, но он должен выглядеть следующим образом. Вам нужно будет запустить сценарий с помощью #!/usr/bin/expect
#!/usr/bin/expect -f
spawn ssh HOSTNAME
expect "login:"
send "username\r"
expect "Password:"
send "password\r"
interact
Ответ 5
Вариант I
sshpass -p PASSWORD ssh [email protected]
Вариант II
#!/usr/bin/expect -f
spawn ssh [email protected] "touch /home/user/ssh_example"
expect "assword:"
send "PASSWORD\r"
interact
Ответ 6
sshpass
с лучшей защитой
Я наткнулся на эту нить, ища путь к ssh в увязший сервер - потребовалось более минуты, чтобы обработать попытку подключения SSH, и тайм-аут, прежде чем я смог ввести пароль. В этом случае я хотел иметь возможность сразу же предоставить мой пароль, когда появится приглашение.
(И если это не мучительно ясно: с сервером в этом состоянии, слишком поздно, чтобы настроить вход в открытый ключ.)
sshpass
на помощь. Однако есть более эффективные способы сделать это, чем sshpass -p
.
Моя реализация переходит непосредственно к приглашению интерактивного пароля (не тратится время на просмотр, если произойдет обмен публичным ключом), и никогда не раскрывает пароль как обычный текст.
#!/bin/sh
# preempt-ssh.sh
# usage: same arguments that you'd pass to ssh normally
echo "You're going to run (with our additions) ssh [email protected]"
# Read password interactively and save it to the environment
read -s -p "Password to use: " SSHPASS
export SSHPASS
# have sshpass load the password from the environment, and skip public key auth
# all other args come directly from the input
sshpass -e ssh -o PreferredAuthentications=keyboard-interactive -o PubkeyAuthentication=no "[email protected]"
# clear the exported variable containing the password
unset SSHPASS
Ответ 7
sshpass + autossh
Один приятный бонус уже упомянутого sshpass
заключается в том, что вы можете использовать его с autossh
, устраняя еще большую часть интерактивной неэффективности.
sshpass -p mypassword autossh -M0 -t [email protected]
Это позволит автоподключиться, если, например, ваш Wi-Fi прерван закрытием вашего ноутбука.
Ответ 8
# create a file that echo out your password .. you may need to get crazy with escape chars or for extra credit put ASCII in your password...
echo "echo YerPasswordhere" > /tmp/1
chmod 777 /tmp/1
# sets some vars for ssh to play nice with something to do with GUI but here we are using it to pass creds.
export SSH_ASKPASS="/tmp/1"
export DISPLAY=YOURDOINGITWRONG
setsid ssh [email protected] -p 22
ссылка: https://www.linkedin.com/pulse/youre-doing-wrong-ssh-plain-text-credentials-robert-mccurdy?trk=mp-reader-card
Ответ 9
Я не думаю, что видел, чтобы кто-то предложил это, и ОП просто сказал "сценарий", так что...
Мне нужно было решить ту же проблему, и мой самый удобный язык - это Python.
Я использовал библиотеку paramiko. Кроме того, мне также нужно было выдавать команды, для которых мне понадобятся расширенные разрешения, используя sudo
. Оказывается, sudo может принять свой пароль через стандартный ввод через флаг [-S "! Смотрите ниже:
import paramiko
ssh_client = paramiko.SSHClient()
# To avoid an "unknown hosts" error. Solve this differently if you must...
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# This mechanism uses a private key.
pkey = paramiko.RSAKey.from_private_key_file(PKEY_PATH)
# This mechanism uses a password.
# Get it from cli args or a file or hard code it, whatever works best for you
password = "password"
ssh_client.connect(hostname="my.host.name.com",
username="username",
# Uncomment one of the following...
# password=password
# pkey=pkey
)
# do something restricted
# If you don't need escalated permissions, omit everything before "mkdir"
command = "echo {} | sudo -S mkdir /var/log/test_dir 2>/dev/null".format(password)
# In order to inspect the exit code
# you need go under paramiko hood a bit
# rather than just using "ssh_client.exec_command()"
chan = ssh_client.get_transport().open_session()
chan.exec_command(command)
exit_status = chan.recv_exit_status()
if exit_status != 0:
stderr = chan.recv_stderr(5000)
# Note that sudo "-S" flag will send the password prompt to stderr
# so you will see that string here too, as well as the actual error.
# It was because of this behavior that we needed access to the exit code
# to assert success.
logger.error("Uh oh")
logger.error(stderr)
else:
logger.info("Successful!")
Надеюсь, это кому-нибудь поможет. Моим примером использования было создание каталогов, отправка и распаковка файлов и запуск программ на ~ 300 серверах одновременно. Таким образом, автоматизация была первостепенной. Я попробовал sshpass
, expect
, а затем придумал это.
Ответ 10
Я работал следующим образом
.ssh/config был изменен, чтобы исключить приглашение yes/no - я за брандмауэром, поэтому я не беспокоюсь о подделанных ключах ssh
host *
StrictHostKeyChecking no
Создайте файл ответов для ожидания, т.е. answer.expect
set timeout 20
set node [lindex $argv 0]
spawn ssh [email protected] service hadoop-hdfs-datanode restart
expect "*?assword {
send "password\r" <- your password here.
interact
Создайте bash script и просто вызовите ожидание в файле
#!/bin/bash
i=1
while [$i -lt 129] # a few nodes here
expect answer.expect hadoopslave$i
i=[$i + 1]
sleep 5
done
Получает 128 обновленных datanodes hadoop с новой конфигурацией - при условии, что вы используете монтирование NFS для файлов hadoop/conf
Надеюсь, что это помогает кому-то - я - numpty, и мне потребовалось около 5 часов!
Ответ 11
Так я захожу на свои серверы.
ssp <server_ip>
И поэтому...
ssp server_ip
Ответ 12
У меня есть лучшее решение, которое включает логин с вашей учетной записью, чем переход на пользователя root.
Это bash script
http://felipeferreira.net/index.php/2011/09/ssh-automatic-login/
Ответ 13
Ответ @abbotto для меня не сработал, пришлось делать что-то по-другому:
Ответ 14
Мне удалось заставить это работать с этим:
SSH_ASKPASS="echo \"my-pass-here\""
ssh -tt remotehost -l myusername
Ответ 15
Если вы делаете это в системе Windows, вы можете использовать Plink (часть PuTTY).
plink [email protected] -pw your_password
Ответ 16
В приведенном ниже примере я напишу решение, которое я использовал:
Сценарий: я хочу скопировать файл с сервера, используя скрипт sh:
#!/usr/bin/expect
$PASSWORD=password
my_script=$(expect -c "spawn scp [email protected]:path/file.txt /home/Amine/Bureau/trash/test/
expect \"password:\"
send \"$PASSWORD\r\"
expect \"#\"
send \"exit \r\"
")
echo "$my_script"
Ответ 17
Используйте этот скрипт, чтобы включить его в скрипт. Первый аргумент - это имя хоста, а второй - пароль.
#!/usr/bin/expect
set pass [lindex $argv 1]
set host [lindex $argv 0]
spawn ssh -t [email protected]$host echo Hello
expect "*assword: "
send "$pass\n";
interact"
Ответ 18
Чтобы получить обмен ключами для работы с флэш-накопителем, вы должны скопировать свой закрытый ключ на свой диск и указать его в своей команде ssh (чтобы избежать использования закрытого ключа локальных учетных записей), например:
ssh -i id_rsa host
В качестве альтернативы вы можете использовать expect (который представляет собой отдельный script из оболочки). Здесь предыдущий вопрос относительно SSH и ожидаем.
Обратите внимание, что каждый сможет открыть ожидаемый script и увидеть учетные данные для входа в обычный текст.
Ответ 19
Сделай это:
echo mypassword | ssh [email protected]
Это просто передает пароль в ssh, и он используется в качестве непосредственного требуемого ввода.
Ответ 20
sudo ssh [email protected]_ip_address -p port_number
нажмите клавишу ввода, затем введите системный пароль и, наконец, введите пароль сервера
Ответ 21
Чтобы подключить удаленный компьютер через сценарии оболочки, используйте команду ниже:
sshpass -p PASSWORD ssh -o StrictHostKeyChecking=no [email protected]
где IPADDRESS
, USERNAME
и PASSWORD
- это входные значения, которые необходимо предоставить в script, или если мы хотим предоставить во время выполнения команду "читать".