Мне нужно использовать sshpass
для запуска удаленной команды через SSH из кода Java.
Если я вручную набираю консоль:
ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
работает отлично, но запрашивает пароль. Поэтому я попытался запустить sshpass
:
sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'
и ни один из них не работал.
Это может быть вызвано проверками ключа хоста, выполненными в ssh
. Похоже, sshpass
хранит молчание о недопустимых ключах хоста (нет вывода ни на stderr
, ни stdout
) и существует с кодом состояния 6
. На момент написания этой статьи это была ревизия 50, и константой соответствия в коде является RETURN_HOST_KEY_UNKNOWN
, что указывает на эту ошибку.
Ваш код ошибки может отличаться, и просмотр приведенного выше кода может дать вам некоторое представление.
Если у вас проблема с неверным ключом хоста, вам следует дважды подумать о переопределении ошибки с помощью опции CLI. Ваша машина может быть взломана, или вы можете подвергнуться атаке MITM! Если вы на 100% уверены, что это не так, и если у вас нет средств для поддержания проверенных ключей хоста в актуальном состоянии , вы можете использовать такую команду:
sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
Существует много способов сделать это, вот мое предлагаемое решение:
Прежде всего, сохранение вашего пароля в переменной дает вам более гибкие команды. sshpass
имеет параметр для этого:
-e
: этот параметр позволяет считывать пароль из переменной среды $SSHPASS
У вас есть два способа установить эту переменную:
[ 1111]Установите прямо в своем коде:
export SSHPASS='your_pass'
Или попросите его:
readPassword () {
echo Ssh Password:
read -s SSHPASS
eval "export SSHPASS='""$SSHPASS""'"
}
# read password
readPassword
Чем выполните вашу команду;
Если ваша команда статическая, запустите ее напрямую:
sshpass -e ssh user@host << EOF
mplayer '/media/data/myFavouriteSong.mp3'
command2 parameter1 parameter2 parameter3 ...
command3 parameter1 parameter2 parameter3 ...
...
EOF
Если ваша команда будет динамически использоваться, как эта :
DYN_FILE_LOC='/media/data/myFavouriteSong.mp3'
eval 'sshpass -e ssh user@host << EOF
mplayer "$DYN_FILE_LOC"
command2 parameter1 parameter2 parameter3 ...
command3 parameter1 parameter2 parameter3 ...
...
EOF'
надеюсь, что это кому-нибудь поможет.
readPassword
функция, можно просто записать пароль, она должна работать:) Только я хочу совместно использовать свой код, который является шоу пример с помощью sshpass
для динамических команд: D
– o.k.w
20.04.2015, 15:07
Вы настраивали вход без пароля?
Вход без пароля с OpenSSH http://www.debian-administration.org/articles/152
Я думаю, вы хотите что-то вроде:
sshpass -p yourpassword ssh user@ipaddress somecommand
Например, это работает для меня:
sshpass -p mypassword ssh username@10.0.0.9 touch foo
Синтаксис sshpass:
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
Обратите внимание, что между -p и паролем нет пробела.
Также я заметил, что вам необходимо хотя бы один раз подключиться к ssh вручную, чтобы получить ключ RSA компьютера, к которому вы подключаетесь, чтобы перейти в файл ~/.ssh/known_hosts
, прежде чем sshpass позволит вам подключиться. [116 ]
, поэтому после получения записи в файле known_hosts я могу выполнить команду, такую как
sshpass -ffilename_with_password_in_it ssh user@server uname -a
, и она выполнит команду uname -a
на удаленном сервере и выведет результаты в стандартный вывод на местная машина.
sshpass
использует псевдотерминалы, а страница man
содержит извинения за случайное прерывание Вы также можете попробовать fd0ssh
. Это работает, если вам не нужно отправлять stdin
процессу на удаленном компьютере. Это сработает, если вы просто введете команду и получите результат.
сделать ключ
ssh-keygen -t rsa
сделать папку .ssh на удаленном сервере, он будет запрашивать пароль [1110 ]
ssh $USER@SEVERNAME mkdir -p .ssh
скопировать ключ на удаленный сервер
cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'
Проверьте, запрашивает ли он пароль, если нет, он должен работать.
ssh $USER@SEVERNAME 'command'
То, что вам нужно, это -f -t -t -t
sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND
Кроме того, вам может потребоваться удалить «requiretty» из конфигурации sudo (/ etc / sudoers) на удаленной машине.
sshpass
работает только в том случае, если запрос пароля заканчивается на assword:
.
Если ваша подсказка пароля отличается, вам, возможно, придется настроить исходный код sshpass
, чтобы распознать вашу подсказку.
Я видел парольные запросы типа Password for user@host:
в некоторых системах, возможно, это ваша проблема.
-P prompt Which string should sshpass search for to detect a password prompt
– Benjamin Gruenbaum
29.10.2017, 08:34
StrictHostKeyChecking=accept-new
. – Makyen 03.10.2018, 07:25