Як користуватися sshpass?


28

Мені потрібно використовувати 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

Це може бути викликано перевірками ключа хоста, виконаними компанією ssh. Схоже, sshpassмовчить про недійсні хост-ключі (немає виводу ні на, stderrні stdout), і існує зі статусом-кодом 6. На момент написання цього запису це було редакцією 50, і константа відповідності в коді є RETURN_HOST_KEY_UNKNOWN, що натякає на цю помилку.

Ваш код помилки може відрізнятися, і перегляд наведеного вище коду може дати вам деяке розуміння.

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

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

2
З установкою заварки потрібно пробіл після -p. github.com/hudochenkov/homebrew-sshpass
AnneTheAgile

УВАГА: Усі повинні пам’ятати, що безпечніше використовувати безпечні ключі хоста SSH, коли це можливо! За визначенням, використання SSHPass менш безпечне.
питання

@Questionmark, хоча це правда, бувають крайні випадки, коли віддалена кінцева точка не підтримує автентифікацію за допомогою ключа. Звідси тут стане в нагоді
sshpass

Так, я знаю. Ось чому я сказав "коли це можливо" ...
питання

1
З новим достатньо SSH, є StrictHostKeyChecking=accept-new.
муру

5

sshpassпрацює, лише якщо запит на пароль закінчується assword:.

Якщо підказка вашого пароля інша, вам, можливо, доведеться відрегулювати вихідний код, sshpassщоб розпізнати відповідний рядок.

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


1
вибачте? -P prompt Which string should sshpass search for to detect a password prompt
м3нда

2
Ця нова опція (потребує щонайменше V1.0.6 sshpass) вирішує цю проблему.
rjs

Ой, вибачте. Такі питання (рішення?) Трапляються так часто, старі питання, які вже виправлені в нових версіях. Спасибі.
м3нда

2

Я думаю, ти хочеш чогось типу:

sshpass -p yourpassword ssh user@ipaddress somecommand

Наприклад, для мене це працює:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

Ви налаштували без пароля вхід?

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


Я вважаю за краще дотримуватися sshpass через незручності ввімкнення доступу до пароля на підприємстві
Roman Rdgz

Ви спробували це: sshpass -p 'mypass' ssh username@server.example.com
koni_raid

Я зробив це, неважливо, я використовую "mypass" або "mypass". Він починає чекати вічно
Роман Rdgz

sshpass -V працює?
koni_raid

На ній друкується: "Ця програма є безкоштовним програмним забезпеченням і може поширюватися за умовами GPL. Докладнішу інформацію див. У файлі КОПІЄННЯ". А потім закінчує його виконання і більше нічого не робить (я спробував додати -V до початку команди, якою я обробляв, а не просто вводив sshpass -V)
Роман Rdgz

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'
    

сподіваюся, що це комусь допоможе.


У вашій функції readPassword ви не можете просто експортувати SSHPASS?
kutschkem

@kutschkem, я вірю, але моя ідея, що я думаю тут; я не хочу писати пропуск у статичний файл, але замість того, щоб писати пароль знову і знову для багатьох серверів (7+), я пишу один раз :) Вам не потрібно використовувати readPasswordфункцію, ви можете просто написати свій пароль, це повинен працювати :) Тільки я хочу поділитися своїм кодом, який показує приклад використання sshpassдинамічних команд: D
veysiertekin

Ні, я просто маю на увазі, що eval після прочитаного не потрібен, експорт не потребує призначення. ss64.com/bash/export.html
kutschkem

Проблема -e полягає в тому, що експорт буде вказаний у вашій історії
ejaenv

0

sshpassвикористовує псевдотермінали, а manсторінка містить вибачення за випадкові порушення. Ви також можете спробувати fd0ssh. Він працює, якщо вам не потрібно надсилати stdinпроцес на віддаленій машині. Це працює, якщо ви просто видаєте команду і фіксуєте результат.


0

синтаксис sshpass є

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

Зауважте, що між -p та паролем немає місця.

Також я помітив, що вам потрібно принаймні один раз підключитися до ssh, щоб отримати ключ RSA машини, до якої ви підключаєтесь, щоб зайти у ~/.ssh/known_hostsфайл, перш ніж sshpass дозволить вам підключитися.

тому після отримання запису у відомому файлі знаних_хостів я можу запустити таку команду, як

sshpass -ffilename_with_password_in_it ssh user@server uname -a

і він виконає команду uname -aна віддаленому сервері і виведе результати на стандарт на локальній машині.


0

Те, що вам потрібно, це -f -t -t -t

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

Крім того, можливо, вам доведеться видалити "requtty" з sudo config (/ etc / sudoers) на віддаленій машині.


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'

0

@exhuma мав приклад, який призводив до того, що він працював на мене.

Пароль повинен бути у формі -pPassword(без пробілу)

також можуть знадобитися цитати: sshpass -p'Password&0' user@hostname

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.