Как использовать sshpass?

20

Мне нужно использовать 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'

и никто из них не работает.

    
задан Roman Rdgz 17.04.2013 в 10:43
источник

10 ответов

19

У меня есть команда вроде этого:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

и он работает.

В моем случае StrictHostKeyChecking=no необходимо, потому что команды выполняются на тонне хостов, которые регулярно обмениваются (сетевые маршрутизаторы).

Из любопытства я попытался запустить его без команды, просто чтобы посмотреть, что происходит. Оказывается, sshpass сохраняет молчание (без выхода на stderr ). Но возвращаемый код в этом случае равен 6 . На момент написания этой статьи это была ревизия 50, а константа соответствия в коде RETURN_HOST_KEY_UNKNOWN , что имеет смысл.

Возможно, это та же проблема в вашем случае?

Если это не так, правильно ли вы указали удаленную команду?

    
ответ дан exhuma 04.12.2013 в 10:23
4

sshpass работает только в том случае, если запрос пароля заканчивается на assword: .

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

Я видел подсказки пароля как Password for user@host: на некоторых системах, возможно, это ваша проблема.

    
ответ дан rjs 14.07.2014 в 13:45
1

Вы установили пароль для входа в систему без пароля?

Пароль без входа с OpenSSH Ссылка

    
ответ дан konrad 17.04.2013 в 10:52
1

Существует много способов сделать это, вот мое предлагаемое решение:

Прежде всего, сохранение вашего пароля в переменной дает вам более гибкие команды. sshpass имеет возможность для этого:

-e : эта опция позволяет читать пароль из переменной среды $SSHPASS

У вас есть два способа установить эту переменную:

  1. Установите прямо в свой код:

    export SSHPASS='your_pass'
    
  2. Или попросите его:

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    

Зачем выполнять вашу команду,

  1. Если ваша команда статична, запустите ее напрямую:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. Если ваша команда будет динамической, используйте следующую команду:

    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'
    

надеюсь, что это поможет кому-то.

    
ответ дан veysiertekin 27.03.2015 в 14:59
1

Я думаю, вам нужно что-то вроде:

ssh -p yourpassword ssh user@ipaddress somecommand

Например, это работает для меня:

sshpass -p mypassword ssh username@10.0.0.9 touch foo
    
ответ дан benofben 07.02.2016 в 07:27
0

sshpass использует псевдотерминалы, а страница man содержит извинения за временное прерывание. Вы также можете попробовать fd0ssh . Он работает, если вам не нужно отправлять stdin в процесс на удаленном компьютере. Это работает, если вы просто выдаете команду и фиксируете результат.

    
ответ дан Bruce 26.07.2013 в 17:44
0

Синтаксис 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 на удаленном сервере и выведет результаты на стандартную версию на локальном компьютере.

    
ответ дан BeowulfNode42 15.05.2014 в 08:16
0

Что вам нужно, это -f -t -t -t

sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND

Кроме того, вам может потребоваться удалить «requiretty» из sudo config (/ etc / sudoers) на удаленном компьютере.

    
ответ дан Ehsan 26.05.2014 в 21:27
0
  1. сделать ключ

    ssh-keygen -t rsa

  2. создайте папку .ssh на удаленном сервере, она попросит пароль

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. скопируйте ключ на удаленный сервер

    cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'

Проверьте, запрашивает ли пароль пароль, если он не работает.

ssh $USER@SEVERNAME 'command'
    
ответ дан VeggieVampire 08.06.2015 в 13:48
0

@exhuma привел пример, который привел к его работе для меня.

Пароль должен быть в форме -pPassword (без пробела)

также могут потребоваться кавычки: sshpass -p'Password&0' user@hostname

    
ответ дан user3367115 29.09.2015 в 01:52