Как сделать SSH в одну строку

27

Как бы я подключился к другому компьютеру через SSH в одну линию? Если бы я это сделал ssh host@IP, мне потребовалось бы ввести пароль во второй строке. Я думал, что мог бы сделать что-то вроде этого:, ssh host@IP | echo passwordно это вводит пароль, прежде чем спрашивать пароль.

Бен А.
источник
2
Такое мышление пришло со времен telnet и ожидалось, когда Интернет был более безопасным местом. Ответ Аллена правильный, ответ Jakuje технически правдив, но в большинстве мест он не является инструментом для работы.
Кригги
3
Это хороший вопрос для настройки входа без пароля. Я бы попросил вас вернуться к принятому ответу. Какой ответ Jakuje является правильным и будет работать, правильный способ сделать это с помощью ключей SSH, описанных в ответе Аллана.
Скотт
Если sshбы прочитал пароль из stdin, то echo password | ssh host@IPработал бы, но обычно SSH пытается читать прямо из терминала.
Пауло Эберманн

Ответы:

79

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

Это работает так, как только вы настроили ваши SSH-ключи, все, что вам нужно сделать, это выполнить команду:

ssh user@host

и без ввода другой вещи, вы будете автоматически авторизованы.


Скопируйте открытый ключ SSH в Mac / FreeBSD / Linux из macOS

Это предполагает, что у вас есть доступ к удаленному серверу с помощью аутентификации на основе пароля (ввод пароля), и что вы уже сгенерировали свою частную / открытую пару ключей (если нет, см. Ниже). В следующем примере мы используем RSA. Для начала давайте скопируем ключ (учтите, что «домашний» каталог отличается в macOS, Linux, BSD и т. Д.):

Используя SCP:

scp ~/.ssh/id_rsa.pub username@hostname:/Users/username/.ssh/

Или просто присваивать файл authorized_keys(я предпочитаю этот метод):

cat id_rsa.pub | ssh username@hostname ' cat >>.ssh/authorized_keys'

(Ваше имя ключа может отличаться). Если каталог .ssh не существует на удаленном сервере, вам нужно будет войти и создать его.

Теперь ключ был скопирован с Mac на удаленный сервер. Установите правильные разрешения для открытого ключа SSH на удаленном сервере:

chmod 600  ~/.ssh/id_rsa.pub

Затем добавьте ключ в файл авторизованного ключа SSH, если файл не существует, создайте его.

Если файл authorized_keysуже существует, ~/.sshиспользуйте следующую команду:

cat id_rsa.pub >> authorized_keys

Если файл не существует, введите следующие команды:

cat id_rsa.pub > authorized_keys

chmod 600 authorized_keys
chown user:group authorized_keys


Создать SSH открытый / закрытый ключ на macOS

Откройте Терминал, перейдя в Приложения -> Утилиты -> Терминал

В терминале используйте следующую команду для запуска генерации ключа

ssh-keygen -t rsa

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

Введите файл для сохранения ключа ( /Users/username/.ssh/id_rsa):

Оставьте это поле пустым, чтобы создать ключ в расположении по умолчанию /Users/username/.ssh/id_rsa. Файл открытого ключа будет создан в том же месте и с тем же именем, но с расширением .PUB.

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

Enter passphrase (empty for no passphrase):

Ваш ключ SSH сгенерирован.

Имейте в виду, что если вы введете парольную фразу, вам потребуется вводить ее каждый раз при подключении. Утилита ssh-agentсохранит парольную фразу в памяти, избавляя от необходимости вводить ее вручную каждый раз, когда вы подключаетесь, когда находитесь в том же сеансе. Для более подробной информации смотритеman ssh-agent

Аллан
источник
6
Абсолютно это - ключи могут и должны полностью заменить пароли для любого доступа SSH через Интернет. Я бы посоветовал вам более подробно остановиться на необходимости защиты закрытого ключа, чтобы его нельзя было найти на всех ваших компьютерах.
Кригги
+1 Это действительно хороший ответ не только из-за того, что он говорит, но и из-за того, как вы это объяснили. Все, что проще для пользователей и помогает им быть более защищенными, является плюсом в моих книгах!
Мономет
7
Отличный ответ. Просто хотел добавить, что ssh-copy-idэто хороший инструмент для автоматизации некоторых из вышеперечисленных.
Скотт
Упоминание о ssh-agent также может помочь. Большинство (все?) Версии OS X / macOS поставляются с ним, и это позволяет входить без пароля, даже когда ключ защищен паролем.
Qsigma
1
@Scot - по умолчанию он не является частью macOS и должен быть установлен через Homebrew или MacPorts . Я не фанат установки программного обеспечения для вещей, которые могут быть выполнены в 1 строку или коротким, самостоятельно написанным сценарием, и по этим причинам я думал, что это выходит за рамки ответа. Тем не менее, это хорошая небольшая утилита и стоит упомянуть.
Аллан
13

Есть несколько возможностей. Ваш пример, очевидно, не будет работать, но вы можете добиться чего-то подобного, используя sshpassутилиту:

sshpass -p password ssh host@IP

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

Гораздо лучший способ сделать то же самое - настроить аутентификацию без пароля с использованием ключей SSH. Короче говоря:

ssh-keygen -t rsa -f ~/.ssh/id_rsa
ssh-copy-id IP
Jakuje
источник
Я попытался, sshpassкак вы рекомендовали, но он сказал, что команда не найдена.
Бен А.
8
Ну ... Вам, вероятно, придется установить его. И нет, я не рекомендую это. Настройте аутентификацию без пароля с помощью ключей ssh.
Jakuje
4
@BenA. установить аутентификацию без пароля, определив общедоступную / приватную клавиатуру и настроив ее на обеих задействованных машинах. Это намного проще (и на самом деле безопаснее), чем любой пароль
nohillside
8
Тысячу раз нет. sshpass - это грязный хак, используемый для подключения к устройствам, которые говорят по ssh, но не работают с ключами должным образом, и его основное использование - скрипты установки. Вы не будете использовать sshpass на многопользовательской машине, ps auxw | grep sshpass которая сообщит другим пользователям пароль ssh.
Кригги
1
@ Кригги, не совсем. Несмотря на то, что я на 100% отстаю решение на основе ключей, у меня есть sshpass для пары Raspberry Pis только для внутреннего использования (для случайных задач и доступа случайных клиентов; передача ключей только для внутреннего использования - непростая задача). Запуск команды дает следующий результат: pi@sshbox:~ $ ps auxw | grep sshpass pi 4891 0.0 0.3 2256 1560 pts/0 S+ 06:29 0:00 sshpass -p zzzzzzzz ssh pi@192.168.0.208. zzzzzzzzБуквально; sshpass маскирует содержимое пароля. Возможно, более ранние итерации были менее конфиденциальны.
flith
3

Я тоже долго искал ответ на этот вопрос. Несмотря на то, что это небезопасно и все эти люди говорят вам использовать ключи RSA ( что является более безопасной и надежной идеей ), это вполне возможно.

Используйте программу expectдля этого. Expect будет наблюдать за stdout (и я думаю, что stderr, если он настроен правильно), ожидает определенных сообщений и отвечает на них выводом. Сам по себе Expect на самом деле является языком сценариев, и когда я делал то же самое, мне было очень трудно заставить свой собственный сценарий работать должным образом из-за времени. Однако, ожидайте также включает удобную утилиту под названием autoexpect.

С помощью autoexpect он будет наблюдать за вами и генерировать ожидаемый скрипт для вас. Просто запустите autoexpect и команду, которую вы хотите:

autoexpect ssh host@ip 

и делай то, что ты обычно делаешь. Когда вы выходите из программы (набирая exitв командной строке ssh'd), она генерирует скрипт. Если вы не хотите, чтобы весь сценарий, который вы пишете, был в ожидаемом сценарии, вы можете отредактировать сценарий из autoexpect (вызываемого script.exp) для выхода перед вводом exitкоманды в оболочку. Строка, которую вы хотите переместить, чтобы изменить окончание скрипта:

expect eof

что означает ожидать конца файла. Надеюсь это поможет!

Аллан
источник
1
В случае, если никто еще не сказал это: добро пожаловать, чтобы спросить другого!
Synoli
2

Использовать expectпросто неправильно для входа в ssh-соединение для чего-либо, кроме тестового набора.

То, что ищет @ ben-a, уже реализовано в ssh. Хитрость в том, как это использовать. Так что здесь идет:

  1. Создайте пару открытых / закрытых ключей, используя ssh-keygen. Используйте ECDSA или RSA в качестве -t(или типа), а для RSA используйте 2048 или 4096 в качестве -b(или длины BITS). Этого должно хватить на момент написания. ВСЕГДА используйте ПАРОЛЬ!
  2. Используйте ssh-copy-idили вышеупомянутую методологию, чтобы создать на компьютере, на котором вы входите (или на сервере), ~/.ssh/authorized_keysфайл. Внутри есть копия открытого ключа, который вы только что сгенерировали.
  3. Теперь на компьютере, который вы используете для входа на «сервер» (или клиент), вы открываете файл ~/.ssh/config. Если он не существует, вы можете создать его.
  4. В этом файле вы добавляете следующее для своих нужд

    host <name you want to use for this connection>
        Hostname <DNS or IP of the server>
        user <user name you want to use>
        identitiesonly yes
        identityfile <path to the private key>
  5. Теперь вы можете использовать только ssh <name>для настройки соединения, но для вашего ключа все равно потребуется пароль. Чтобы решить эту проблему, используйте специально разработанный ssh-агент для этой цели. Чтобы добавить свой ключ к агенту просто используйте ssh-add <path to keyfile>. Вам будет предложено ввести пароль, и он будет надежно хранить ключ для этого сеанса. Если выдается ошибка «не удается найти ssh-agent» (или аналогичную), это означает, что, возможно, агент не был запущен. Вы можете запустить его для этой сессии, используя ssh-agent bash. Это запустит новую оболочку с активным агентом.

Используя эти шаги, вам не только будет труднее выдавать себя за другого, похищая ваши учетные данные, но и поддерживать удобство использования в порядке (его проще использовать, чем простые пароли).

LVB
источник