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" 
   }
}

Цей код не працює належним чином, він все ще запитує пароль. Може хтось, будь ласка, допоможе мені у вирішенні цього



Відповіді:


36

Я колись написав expectсценарій для входу на ssh-сервер (як у вашому випадку), і мій сценарій був приблизно таким:

#!/usr/bin/expect

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

Я думаю, можливо interact, у вашому сценарії цього немає.


це абсолютно працює нормально для мене , і я застряг в цьому місці, взаємодіють забезпечує інтерактивний термінал з підказкою, але я намагаюся автоматизувати далі більше кроків подобається робити cdі lsі прочитати вміст файлу , а також. Чи можна це робити після взаємодії? Будь ласка, відповідайте
Hansiemithun

@Hansie ви можете відправити lsкоманду після входу. Наприклад, відправивши пароль, зробіть expectтекст командного рядка (щоб переконатися, що ви ввійшли в систему), потім send "ls\r". Все це йде раніше interact.
saeedn

запитання було трохи невірним, і мені дуже шкода, що я зробив ls та прочитав вміст, я можу надрукувати те саме. Але як отримати це з сеансу ssh в змінну для доступу з локальної машини. ref: stackoverflow.com/questions/32341234/expect-script-return-value . Але вихід для мене не працює. Моє питання відповідав: stackoverflow.com/questions/51628465 / ... . Мені потрібно file_listпісля виходу для доступу з локального командного рядка
Hansiemithun

31

Ти йдеш про це неправильним шляхом. Що ви хочете зробити, це генерувати паролю ssh-ключів, а потім (доки сервер підтримує автентифікацію ключа 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>

І ви ввійдете в систему, не вимагаючи пароля.

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


2
Я б використовував ключі RSA, а не DSA. Але крім цього, повна згода.
glglgl

12
іноді ви не можете додавати ключі до віддаленого хоста, наприклад, мережеві пристрої.
DarkHeart

1
Я спробував це. ssh все ще запитує пароль. Вам спеціально потрібно вказати IP-адресу? Я спробував це і з <user> @ <ім'ям домену>, і просто з доменним ім'ям.
Джей Біенвену

Ця команда сказала занадто багато аргументів? (для кроку 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.


7

Спочатку встановіть sshPass sudo apt-get install sshpass

Потім створіть псевдонім у .bashrc-файлі як

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

Тепер перезавантажте змінений файл .bashrc source ~/.bashrc

Ви закінчили.

Тепер ви можете запустити ssh, використовуючи вище створений псевдонім sshLoginу терміналі.



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

#roaima Так, але це algo підказує неймовірно корисну ssh-copy-idкоманду, яку ніхто більше не згадував. Я за це виступаю.
Х'ю Уолтерс

1

Безпечний вхід в SSH за допомогою SSH Keygen у 5 простих кроків :

Налаштування навколишнього середовища: введіть тут опис зображення

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

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

Крок 2: Створіть .ssh Directory на - 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каталогом користувача у вигляді імені файлу санкціонованих_кіїв.

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

Крок 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 без пароля.

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


Дякую ... це спрацювало для мене, за винятком кроку 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 відкриється з'єднання.


0

Нещодавно я це робив, це може вам допомогти:

sshpass -p 'password' username@ipaddress

якщо це не працює, вам доведеться генерувати ключі на іншій машині, з якою ви хочете підключитися

ssh-keygen

він генерує приватні та відкриті ключі та запитає вас про місцезнаходження, залиште порожнім, він збереже ключі у папці. ім'я відкритого ключа до "санкціонованих_кіїв"

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.