Shell Script для входа на ssh сервер

29

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

set timeout 30
/usr/bin/ssh -p 8484 root@172.31.72.103
expect 
{
   "root@172.31.72.103's password" 
   {
      send "password\r" 
   }
}

Этот код не работает должным образом, все же он запрашивает пароль. Может кто-нибудь, пожалуйста, помогите мне в решении этого

pradeepchhetri
источник
2
Связано: передать пароль su / sudo / ssh
Петр Доброгост
serverfault.com/questions/241588/…
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件

Ответы:

36

Однажды я написал expectскрипт для входа на ssh-сервер (как в вашем случае), и мой скрипт был примерно таким:

#!/usr/bin/expect

spawn ssh MyUserName@192.168.20.20
expect "password"
send "MyPassword\r"
interact

Я думаю, что, возможно, interactотсутствует в вашем сценарии.

saeedn
источник
это абсолютно работает нормально для меня , и я застрял в этом очередь, взаимодействуют обеспечивает интерактивный терминал с подсказкой, но я пытаюсь автоматизировать дальше больше шагов нравится делать cdи lsи прочитать содержимое файла , а также. Можно ли это сделать после взаимодействия? Пожалуйста, ответьте
Hansiemithun
@ Ханси, вы можете отправить lsкоманду после входа в систему. Например, после отправки пароля выполните команду expectс текстом командной строки (чтобы убедиться, что вы вошли в систему), затем send "ls\r". Все это идет раньше interact.
Саидн
вопрос был немного неправильным, и я прошу прощения после выполнения ls и чтения содержимого, я могу напечатать то же самое. Но как получить это из сессии ssh в переменную для доступа с локальной машины. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Но вывод не работает для меня. Мой вопрос опубликован: stackoverflow.com/questions/51628465/… . Мне нужно file_listпосле выхода для доступа из локальной командной строки
Hansiemithun
31

Вы идете об этом неправильно. Что вы хотите сделать, это создать пару паролей ssh-key без пароля, а затем (если сервер поддерживает аутентификацию по ключу RSA) вы можете войти без необходимости вводить пароль для всех. Это угроза безопасности, если ваш личный ключ хранится где-то, чтобы его можно было украсть.

Следуй этим шагам:

  1. mkdir -p ~/.ssh
  2. cd ~/.ssh
  3. ssh-keygen -type dsa -i mysshkeys
  4. Нажмите, Returnкогда будет предложено ввести фразу-пароль
  5. Нажмите Returnвторой раз для подтверждения.

Теперь в вашем ~/.sshкаталоге будет два файла , mysshkey.pubи mysshkey. mysshkey.pubэто ваш открытый ключ, этот безопасно поставить на удаленных серверах. mysshkeyэто ваш личный пароль без пароля, его нельзя ставить на удаленные серверы (или где-то еще кто-то может получить копию).

На сервере вы хотите SSH в:

  1. Войти на удаленный сервер
  2. mkdir -p ~/.ssh
  3. Скопируйте и вставьте содержимое mysshkey.pubв~/.ssh/authorized_keys
  4. Убедитесь в том , что ~/.ssh/authorized_keysесть chmod«d , чтобы600

Теперь, чтобы запустить его в действие на вашем локальном компьютере, выполните следующую команду:

ssh -i ~/.ssh/mysshkey <remote_server_ip>

И вы войдете в систему без запроса пароля.

Это очень предпочтительный метод управления автоматическим входом в систему, так как вы не в конечном итоге жестко закодируете свой пароль в нескольких местах, которые необходимо обновить, если вы когда-либо измените его.

synthesizerpatel
источник
2
Я бы использовал ключи RSA, а не DSA. Но кроме этого, полностью согласен.
glglgl
12
иногда вы не можете добавить ключи к удаленному хосту, например, к сетевым устройствам.
DarkHeart
1
Я попробовал это. SSH все еще просит пароль. Вам конкретно нужно дать IP-адрес? Я попробовал это как с <user> @ <domain-name>, так и только с именем домена.
Джей
Эта команда сказала слишком много аргументов? (для шага 3)
Иосиф Астрахань
Мне пришлось изменить на ssh-keygen -t dsa и вручную ввести местоположение файла.
Иосиф Астрахань
20

В дистрибутивах на основе Debian sshpassпакет предоставляет более простой способ делать то, что вы хотите. Пакет доступен для многих других популярных дистрибутивов. Вы должны настроить это сначала:

echo 'YourPassword' > passwordFile.txt
chmod 600 passwordFile.txt

Затем вызовите команду SSH из сценария следующим образом:

sshpass -f /path/to/passwordFile.txt /usr/bin/ssh -p 8484 root@172.31.72.103

Это обеспечивает большую гибкость, например, если вы используете другой языковой стандарт или вам необходимо изменить пароль, чем те решения, которые используются expect.

likeitlikeit
источник
7

Сначала установите sshPass sudo apt-get install sshpass

Затем создайте псевдоним в файле .bashrc как

alias sshLogin='sshpass -p <your ssh password> ssh username@remote_host'

Теперь перезагрузите измененный файл .bashrc source ~/.bashrc

Теперь вы сделали.

Теперь вы можете запустить ssh, используя созданный выше псевдоним sshLoginв терминале.

bpathak
источник
5

Вы можете использовать это:

sshpass -p 'yourpassword'  ssh user@ip
Бехруз Мохамади Насаб
источник
2

Все, что вам нужно, чтобы создать хешированный ключ и сохранить его на ПК

Просто введите

ssh-keygen -t rsa -b 4096 # just press Enter till the end

затем введите

ssh-copy-id <user>@<server>

затем войдите как обычно

ssh <user>@<server>

Теперь вам не нужен пароль

Примечание. Сохранение пароля в виде простого текста опасно.

Этот метод создает хешированное значение вашего пароля с использованием RSA с открытым ключом длиной 4096, что очень безопасно.

Мохаммед Хиззани
источник
1
Похоже, это повторение этого ответа .
Ройма
#roaima Да, но это также предлагает невероятно полезную ssh-copy-idкоманду, о которой никто не упоминал. Я за это голосую.
Ху Уолтерс
1

Вход без пароля по SSH с помощью SSH Keygen за 5 простых шагов :

Настройка среды: введите описание изображения здесь

Шаг 1: Аутентификация SSH-Kegen Keys on - (192.168.0.12)
Сначала войдите на сервер 192.168.0.12 с пользователем и сгенерируйте пару открытых ключей, используя следующую команду.

введите описание изображения здесь

Шаг 2. Создайте каталог .ssh на - 192.168.0.11.
Используйте SSH с сервера 192.168.0.12 для подключения к серверу 192.168.0.11 для создания каталога .ssh под ним, используя следующую команду.

введите описание изображения здесь

Шаг 3. Загрузите
сгенерированные открытые ключи в - 192.168.0.11. Используйте SSH с сервера 192.168.0.12 и загрузите новый сгенерированный открытый ключ (id_rsa.pub) на сервер 192.168.0.11 в .sshкаталоге пользователя в качестве имени файла author_keys .

введите описание изображения здесь

Шаг 4: Установите разрешения на - 192.168.0.11
Из-за разных версий SSH на серверах нам нужно установить разрешения для .sshкаталога и authorized_keysфайла.

введите описание изображения здесь

Шаг 5: Вход с 192.168.0.12 на 192.168.0.11 Сервер без пароля
С этого момента мы можем войти в 192.168.0.11 как пользователь sheena с сервера 192.168.0.12 как пользователь tecmint без пароля.

введите описание изображения здесь

Premraj
источник
Спасибо ... это сработало для меня, за исключением того, что на шаге 4 я получил драматическое "предупреждение": "Незащищенный частный ключевой файл! ... ... /. Ssh / id_rsa 'слишком открыт. ... закрытый ключ будет игнорируется ... плохие разрешения ". Я сделал chmod 700 id_rsaв каталоге .ssh на локальном (клиент, т.е. в вашем примере 192.168.0.12) сервер: проблема решена
Майк Родент
1

Как уже описано в других ответах, я также использую, sshpassно объединяю его с readкомандой для сохранения моего пароля во временной переменной среды. Таким образом, мой пароль никогда не пишется в открытом виде. Вот команда из одной строки, которую я использую:

read -s PASS; sshpass -p $PASS ssh <user>@<host adress>

После этого вы должны ввести свой пароль (на экране ничего не появляется), а затем нажать Enter, чтобы открыть соединение.

Stormrider
источник
0

Я недавно сделал это, это может помочь вам:

sshpass -p 'password' username@ipaddress

если это не сработает, вам придется генерировать ключи на другом компьютере, к которому вы хотите подключиться

ssh-keygen

он сгенерирует закрытые и открытые ключи и попросит вас указать местоположение, оставив пустым, он сохранит ключи в папке .ssh, по умолчанию он попросит вас ввести пароль, вы также можете оставить его пустым, перейти в папку .ssh и изменить имя открытого ключа для «author_keys»

cd .ssh/
mv id_rsa.pub authorized_keys
useradd -d /home/username username

это добавит пользователя в список, теперь перейдет в домашний каталог и даст разрешение и перезапустит службы sshd.

chmod 700 /home/username/.ssh
chmod 644 /home/username/.ssh/authorized_keys
chown root:root /home/dozee
sudo service sshd restart

теперь вам нужно переместить закрытый ключ в систему в том месте, откуда вы собираетесь запустить команду ssh, после чего вы можете соединиться с

sshpass -p 'password' ssh -i id_rsa username@ip

если даже это не сработает, перейдите в / etc / ssh, откройте sshd_config с помощью редактора vim и проверьте, установлен ли параметр pubkeyAuthenticatoin на «да» или «нет», если нет, измените его на «да», перезапустите службы sshd и попробуйте, это определенно будет работать. ,

Уткарш Гупта
источник
0

Первый аргумент - имя хоста, а второй - пароль.

     #!/usr/bin/expect
     set pass [lindex $argv 1]
     set host [lindex $argv 0]
     spawn ssh -t root@$host echo Hello
     expect "*assword: "
     send "$pass\n";
     interact

Выполнение: ./script.expect

Шивам Мехротра
источник