Pass a password to ssh in pure bash
I want to pass a password to ssh using a bash script (Yes, I know that there are ssh keys that I could use, but this is not what I intend). I found some solutions that were using expect but since it is not a standard bash tool I am wondering if I can do this using pipes. Can someone explain to me, why exactly something like this:
echo "password\n" | ssh somehost.com
doesn’t work? Is there any possibility to make it work? Maybe executing ssh as a different process, obtaining its PID and then sending a string directly to it?
Though this question may sound off topic for stackoverflow, I didn’t found it being asked anywhere else. The question and answer helped me understanding that, WHY the pipe didn’t work for ssh. («printf user/pass | vpn user@HOST» works. )
3 Answers 3
You can not specify the password from the command line but you can do either using ssh keys or using sshpass as suggested by John C. or using a expect script.
To use sshpass, you need to install it first. Then
instead of using sshpass -p your_password . As mentioned by Charles Duffy in the comments, it is safer to supply the password from a file or from a variable instead of from command line.
From a security perspective, passwords should never be passed on a command line — command lines are visible to the entire system; even commands that change their command line after they started are vulnerable to capture in the interim. There are other, much safer usage patterns for sshpass if you must use that tool.
You might demonstrate sshpass -f <(printf '%s\n' your_password) ssh user@hostname in the answer, to have a better-practice approach highly visible. (Because printf is a shell builtin, it doesn't get executed as a separate command with its argv exposed via procfs).
$ brew search sshpass . We won’t add sshpass because it makes it too easy for novice SSH users to ruin SSH’s security. That’s comprehensive. Don’t do noninteractive passwords. Do SSH keys.
Since there were no exact answers to my question, I made some investigation why my code doesn’t work when there are other solutions that works, and decided to post what I found to complete the subject.
As it turns out:
«ssh uses direct TTY access to make sure that the password is indeed issued by an interactive keyboard user.» sshpass manpage
which answers the question, why the pipes don’t work in this case. The obvious solution was to create conditions so that ssh «thought» that it is run in the regular terminal and since it may be accomplished by simple posix functions, it is beyond what simple bash offers.
Since you ended up linking to sshpass I think you should have given the other guy credit for the answer.
I suggest you to first read what the question was, instead of adding comments that bring nothing to the topic.
If your question is genuinely only about why thing-X doesn’t work, your title should reflect that, as opposed to being about how to accomplish the goal that thing-X would otherwise be performing. Right now, the body of the question focuses on that area, but the title is all about accomplishing the task.
@CharlesDuffy How does «pure bash» does not reflect the need to use standard bash calls? What kind of mental workout have you done to come to such conclusion?
@BłażejMichalik, . so, the point I’ve been making is that the title should have reflected the question’s intent given in the body. I don’t object to the OP’s intent not to rely on tools not specified by POSIX, built into bash, or provided as part of the SSH package. I do object to their question’s title being a poor fit to that question’s intent.
If you need to use password authentication then more secure is to send the password from a password vault to your clipboard and then just paste it when prompted by ssh. In the following script a credential is passed to a password vault pass and then any additional arguments are passed to ssh. You can use the following script in other scripts to further automate ssh use.
#!/bin/bash USAGE="USAGE: passtossh credential . " [[ $# -lt 2 ]] && echo "$USAGE" && exit 64 CRED="$1" shift echo "Creating a ssh connection using credentials $CRED with parameters $@ ." echo "$(pass "$CRED")" | tr -d '\n' | pbcopy ssh $@
You can use this script like this (for example ssh to a host along with any additional parameters):
$ passtossh my_credential user@host -L 8888:localhost:8888
and when prompted just paste the password. Pbcopy is MacOS utility for sending stdin to clipboard. For windows clip , for linux see for example link.
Benefit is that password will not appear in logs and also the password can only be accessed by whatever authentication you have for the password vault.
Настройка и подключение к Linux по SSH с использованием паролей и ключей
Для подключения по ssh из windows используется ssh клиент, самый популярный это PuTTY, его можно скачать с официального |сайта|, можно скачать как установщик, так и портативную версию. А также, начиная с Windows 10 поддерживается SSH в командной строке, подключение осуществляется так же, как через терминал linux.
Для подключения по логину и паролю достаточно ввести ip-адрес или hostname сервера
Можно сразу ввести имя пользователя, под которым будет осуществляться подключение
Можно сохранить параметры сессии, для этого нужно ввести ее название, оно может быть любым, и нажать Save.
Настройка аутентификации на основе ключей SSH между Windows и Linux
Нужно в windows сгенерировать ключ с помощью программы PuTTYgen, которая устанавливается вместе с PuTTY, в портативной версии ее нет.
После ее запуска нужно нажать кнопку Generate и подвигать мышкой для генерации ключа
Будут сгенерированы ключи Можно задать пароль для ключа в строке Key passphrase, тогда нужно будет вводить его при каждом подключении или можно не задавать.
Закрытый ключ нужно сохранить в системе с которой будет осуществляться подключение, нажав на кнопку Save private key, он будет представлять собой файл формата ppk
который должен быть создан в домашнем каталоге пользователя удаленной системы, к которому будет осуществляться подключение, при этом файл должен иметь право для чтения только владельцем.
cd ~ mkdir .ssh chmod 700 .ssh cd .ssh touch authorized_keys chown -R test_user:test_user .ssh chmod 700 .ssh chmod 600 authorized_keys vim authorized_keys #вставить открытую часть ключа
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGhMhhwetREVgCvfG7lQBzzFnveWFPMkKV+OKGTOVjk3OzqiVWQWYtuJSQ1qft8tePdY5bytsETT/xr/3NFUYFuMCxp3h1oRLFn+BnQLYCTYRnHDpoojE+qMCo5O9aa0C9svgAWA7qGI892qyKvp/zwLhWpH6oN86dqw6X3DwvdEGN2wa1MNjAOdIv/639l9ieRhYwnZntOlvRsmIMyPjMI9CC/SEXENZghaS41M9KT7QqluA3AU0KSUh1xSheHSQ21O33xkdTAtL68wy0kJxJjSURLKulkr0xvlScVK7oVpObLjn1qaAO3yytaf2+6+RAMY7NjuHKA6SD3lBd6hc5 username1@hostname1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDFJP2yGM9KZ2psLgNyNRXtjctZsBamoNtH0/4KY2U+W0ciGONhgKxG/1maNrLDYbjyFL8mUjC5y9EiBGRzSBstMSa789LoKp8D8TJsDQRyEMc4N2DZKVq3PXfvvDFkJT+XBdIWwJNtuPU3greEaBlNb+jxqxU36lgTx57cJdYHafzyD0ZuhNBfwNOSNRxMmsJpNHVeoePcxZ0ZQQ70h9S1VfqJZulIgO8N1sagKaUjZ6GbrGpE0KMWHmSZRzf24zlx14H5vhgKojQp6oEljfK6numn4wfSl1uNX6ePpM+B86SPCOzD8CIM6nMLpKstMPBWRtMYyZGlzV92/mDUbEK/ username2@hostname2
Теперь можно подключаться по ключу из PuTTY, в категории Session указывается пользователь и хост, как и при обычном подключении а в категории Connection ⇒ SSH ⇒ Auth указывается путь к закрытому ключу. Что бы каждый раз не указывать путь к ключу можно сохранить настройки сессии, как было описано ранее.
Принцип работы SSH
При подключении по SSH с использованием ключа, генерируется ключ. Файл открытого ключа копируется в системы, к которым планируется подключиться. Файл закрытого ключа — используется как учётные данные для аутентификации. Разрешение для закрытого ключа — 600, открытого — 644.
- Процесс получения сессионного ключа в общем состоит из:
- При запросе на подключение от клиента сервер отсылает клиенту свой ключ, который храниться в каталоге /etc/ssh;
- Если клиент производит соединение с данным сервером впервые, то пользователя спросят о доверии ключу сервера, при положительном ответе, на клиенте ключ добавляется в ~/.ssh/known_hosts. Если соединение ранее устанавливалось, то клиент сравнивает присланный ключ с ~/.ssh/known_hosts. (ключ можно удалить командой ssh-keygen -R );
- Теперь, когда клиент и сервер установили защищенный канал, они могут произвести аутентификацию по паролю или ключам;
- Клиент отсылает серверу имя пользователя и свой публичный ключ;
- Сервер проверяет в файле /home//.ssh/authorized_keys наличие присланного клиентом открытого ключа. Если открытый ключ найден, то сервер генерирует случайное число, шифрует его открытым ключом клиента, и отсылает результат клиенту;
- Клиент расшифровывает сообщение своим приватным ключом и отправляет результат серверу;
- Сервер проверяет полученный результат на совпадение, и в случае успеха считает аутентификацию успешной;
- Открывается доступ в командную оболочку пользователя на сервере или позволяется копирование файлов.
Безопасность SSH
Некоторые настройки, которые рекомендуется делать для безопасности:
Атакующие в первую очередь проверяют стандартный — 22 порт, можно его сменить
Port 1234 #порт для подключения по SSH
PermitRootLogin no #запрет подключения по SSH под пользователем root
Запрет аутентификации по паролю, если задать этот параметр разрешено будет аутентифицироваться только по ключу
PasswordAuthentication no #запрет подключения по паролю (разрешено подключаться только по ключу)
AllowUsers user1 user2 #список пользователей, для которых разрешено подключение по SSH
AllowUsers group1 group2 #список групп, для которых разрешено подключение по SSH
- Настройка сети в Linux
- Настройка и подключение к Linux по SSH с использованием паролей и ключей
- SELinux в Linux
- Настройка Linux в качестве Master Browser
- Монтирование и размонтирование сетевого каталога в Linux
- Создание пользователя с правами sudo в Linux
- LVM в Linux
- LVM увеличение размера раздела за счет размера другого раздела в Linux
- Не отображаются русские буквы в консоли Linux
- Работа с редактором VIM в Linux
- Разрешения и владельцы файлов и каталогов в Linux
- Пользователи и группы в Linux
- Управление пакетами и репозиториями APT, DPKG в Ubuntu
- Управление пакетами и репозиториями YUM, RPM в CentOS
- Firewalld в Linux
- Управление службами через SYSTEMCTL в Linux
- Устройства и виртуальные файловые системы в Linux
- История команд в Linux
- Ссылки в Linux
- Логи в Linux
- Потоки и конвейеры в Linux
- Обработка консольного текстового вывода в Linux