Как использовать 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
задан 01.02.2018, 09:55

10 ответов

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

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

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

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run
28
ответ дан 14.10.2019, 13:21
  • 1
    С установкой варева пространство необходимо после-p. github.com/hudochenkov/homebrew-sshpass – mmx 21.12.2016, 02:43
  • 2
    УВЕДОМЛЕНИЕ: Все должны помнить, что это более безопасно для использования passwordless SSH Ключи Хоста каждый раз, когда возможный! По определению использование SSHPass менее безопасно. – yeshashah 07.06.2018, 16:45
  • 3
    @Questionmark, в то время как это верно, существуют пограничные случаи, где удаленная конечная точка не поддерживает аутентификацию через ключ. Который является, где sshpass пригождается – Bergi 08.06.2018, 14:42
  • 4
    Да, я знаю. Именно поэтому я сказал " каждый раз, когда possible"... – Bergi 08.06.2018, 17:11
  • 5
    С достаточно новым SSH, there' s StrictHostKeyChecking=accept-new. – Makyen 03.10.2018, 07:25

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

Прежде всего, сохранение вашего пароля в переменной дает вам более гибкие команды. 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'
        

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

    1
    ответ дан 14.10.2019, 13:21
    • 1
      В Вашей функции readPassword, can' t Вы просто экспортируют SSHPASS? – Dror 20.04.2015, 14:13
    • 2
      @kutschkem, я доверяю, но моя идея, что я думаю здесь; я не хочу писать свою передачу в статическом файле, но вместо того, чтобы писать пароль снова и снова для большого количества серверов (7 +), я пишу однажды:) Вы don' t должны использовать readPassword функция, можно просто записать пароль, она должна работать:) Только я хочу совместно использовать свой код, который является шоу пример с помощью sshpass для динамических команд: D – o.k.w 20.04.2015, 15:07
    • 3
      Нет, я просто подразумеваю, что оценка не необходима после того, как чтение, экспорту не нужно присвоение. ss64.com/bash/export.html – erikric 20.04.2015, 15:35
    • 4
      проблема с-e состоит в том, что экспорт будет перечислен в Вашей истории – Jason Punyon 05.03.2018, 23:29

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

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

    1
    ответ дан 14.10.2019, 13:21
    • 1
      I' d скорее придерживаются sshpass, из-за inconvenients включения входа в систему пароля меньше на предприятии – Ian 17.04.2013, 11:57
    • 2
      Сделал Вы пробуете это: sshpass-p ' mypass' ssh username@server.example.com –  17.04.2013, 12:13
    • 3
      Я сделал, doesn' t имеют значение, использую ли я ' mypass' или mypass. Это начинает ожидать навсегда – Leonardo Henriques 17.04.2013, 12:22
    • 4
      sshpass-V работы? – bunbun 17.04.2013, 12:38
    • 5
      Это печатает: " Эта программа является бесплатным программным обеспечением и может быть распределена в соответствии с GPL. Посмотрите файл КОПИРОВАНИЯ для большего количества information". и затем заканчивает его выполнение и не делает ничего иного (я пытался добавить-V к началу команды, которую я обрабатывал, не просто введя sshpass-V), – Jim Callahan 17.04.2013, 12:41

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

    sshpass -p yourpassword ssh user@ipaddress somecommand
    

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

    sshpass -p mypassword ssh username@10.0.0.9 touch foo
    
    2
    ответ дан 14.10.2019, 13:21

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

    0
    ответ дан 14.10.2019, 13:21

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

    0
    ответ дан 14.10.2019, 13:21
    1. сделать ключ

      ssh-keygen -t rsa

    2. сделать папку .ssh на удаленном сервере, он будет запрашивать пароль [1110 ]

      ssh $USER@SEVERNAME mkdir -p .ssh

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

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

    <час>

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

    ssh $USER@SEVERNAME 'command'
    
    0
    ответ дан 14.10.2019, 13:21

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

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

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

    0
    ответ дан 14.10.2019, 13:21

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

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

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

    0
    ответ дан 14.10.2019, 13:21

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

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

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

    5
    ответ дан 14.10.2019, 13:21
    • 1
      извините? -P prompt Which string should sshpass search for to detect a password prompt – Benjamin Gruenbaum 29.10.2017, 08:34
    • 2
      Эта новая опция (потребности, по крайней мере, V1.0.6 sshpass) решает ту проблему. – Bergi 02.11.2017, 12:48
    • 3
      О, извините. Этот вид проблемы (решение?) происходят так часто, старые вопросы, которые уже фиксируются в новых версиях. Спасибо. – jps 02.11.2017, 23:05

    Теги

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