Мне нужно использовать 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'
и ни один из них не работал.
sshpass
использует псевдотерминалы, а страница man
содержит извинения за случайное прерывание Вы также можете попробовать fd0ssh
. Это работает, если вам не нужно отправлять stdin
процессу на удаленном компьютере. Это сработает, если вы просто введете команду и получите результат.
Существует много способов сделать это, вот мое предлагаемое решение:
Прежде всего, сохранение вашего пароля в переменной дает вам более гибкие команды. 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'
надеюсь, что это кому-нибудь поможет.
Вы настраивали вход без пароля?
Вход без пароля с OpenSSH http://www.debian-administration.org/articles/152
Это может быть вызвано проверками ключа хоста, выполненными в 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 -p yourpassword ssh user@ipaddress somecommand
Например, это работает для меня:
sshpass -p mypassword ssh username@10.0.0.9 touch foo
sshpass
работает только в том случае, если запрос пароля заканчивается на assword:
.
Если ваша подсказка пароля отличается, вам, возможно, придется настроить исходный код sshpass
, чтобы распознать вашу подсказку.
Я видел парольные запросы типа Password for user@host:
в некоторых системах, возможно, это ваша проблема.
синтаксис sshpass
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
Обратите внимание, что нет никакого пространства между-p и паролем.
Также я заметил, что необходимо соединиться с ssh, по крайней мере, однажды вручную для получения ключа RSA машины, с которой Вы соединяетесь, для входа ~/.ssh/known_hosts
файл прежде sshpass позволит Вам соединяться.
таким образом, после получения записи в known_hosts файле я могу выполнить команду такой как
sshpass -ffilename_with_password_in_it ssh user@server uname -a
и это выполнит команду uname -a
на удаленном сервере и выводе результаты к стандарту на локальной машине.
То, что вам нужно, это -f -t -t -t
sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND
Кроме того, вам может потребоваться удалить «requiretty» из конфигурации sudo (/ etc / sudoers) на удаленной машине.
сделайте ключ
ssh-keygen -t rsa
сделайте .ssh папку на удаленном сервере, который она попросит пароля
ssh $USER@SEVERNAME mkdir -p .ssh
скопируйте ключ к удаленному серверу
cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'
Проверьте, просит ли это пароль, если не это должно работать.
ssh $USER@SEVERNAME 'command'
У @exhuma был пример, который привел меня к работе.
Пароль должен быть в форме -pPassword
(без пробела)
также могут быть необходимы кавычки: sshpass -p'Password&0' user@hostname