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

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

и ни один из них не работал.

28
задан 1 February 2018 в 10:55

10 ответов

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

0
ответ дан 1 February 2018 в 10:55

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

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

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

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

[ 1111]
  • Установите прямо в своем коде:

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

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    
    1. Чем выполните вашу команду;

      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'
        

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

    0
    ответ дан 1 February 2018 в 10:55

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

    Вход без пароля с OpenSSH http://www.debian-administration.org/articles/152

    0
    ответ дан 1 February 2018 в 10:55

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

    Ваш код ошибки может отличаться, и просмотр приведенного выше кода может дать вам некоторое представление.

    Если у вас проблема с неверным ключом хоста, вам следует дважды подумать о переопределении ошибки с помощью опции CLI. Ваша машина может быть взломана, или вы можете подвергнуться атаке MITM! Если вы на 100% уверены, что это не так, и если у вас нет средств для поддержания проверенных ключей хоста в актуальном состоянии , вы можете использовать такую ​​команду:

    sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
    
    0
    ответ дан 1 February 2018 в 10:55

    Я думаю, вы хотите что-то вроде:

    sshpass -p yourpassword ssh user@ipaddress somecommand
    

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

    sshpass -p mypassword ssh username@10.0.0.9 touch foo
    
    0
    ответ дан 1 February 2018 в 10:55

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

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

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

    0
    ответ дан 1 February 2018 в 10:55

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

    0
    ответ дан 1 February 2018 в 10:55

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

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

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

    0
    ответ дан 1 February 2018 в 10:55
    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'
    
    0
    ответ дан 1 February 2018 в 10:55

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

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

    также могут быть необходимы кавычки: sshpass -p'Password&0' user@hostname

    0
    ответ дан 1 February 2018 в 10:55

    Другие вопросы по тегам:

    Похожие вопросы: