sshpassの使用方法


28

sshpassJavaコードからSSH経由でリモートコマンドを起動するために使用する必要があります。

コンソールを手動で入力した場合:

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

これは、によって行われるホストキーチェックが原因である可能性がありますsshsshpass無効なホストキーについては黙っており(どちらにstderrも出力されないstdout)、status-codeとともに存在しているように見えます6。この記事の執筆時点では、これはリビジョン50であり、コード内の一致定数はRETURN_HOST_KEY_UNKNOWNであり、このエラーを示唆しています。

エラーコードは異なる場合があり、上記のリンクされたコードを見ると、洞察が得られる場合があります。

場合は、あなたの問題は、無効なホストキーであるあなたは、CLIオプションを使用してエラーを上書き考え直す必要があります。マシンが危険にさらされたり、MITM攻撃を受ける可能性があります!これが当てはまらないことを100%確信しており、検証済みのホストキーを最新の状態に保つ手段がない場合は、次のようなコマンドを使用できます。

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

2
brew installでは、-pの後にスペースが必要です。github.com/hudochenkov/homebrew-sshpass
AnneTheAgile 16

注意:パスワードなしのSSHホストキーは、可能な限り安全に使用できることを誰もが覚えておく必要があります。定義により、SSHPassの使用は安全性が低くなります。
疑問符

@Questionmarkそれは本当ですが、リモートエンドポイントがキーを介した認証をサポートしていない場合があります。sshpassが便利になるところどちらがある
exhuma

はい、知っています。それが私が「可能な限り」と言った理由です
質問

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
m3nda

2
この新しいオプション(少なくともV1.0.6のsshpassが必要)は、この問題を解決します。
rjs

あ、ごめんなさい。この種の問題(解決策?)は頻繁に発生し、古いバージョンの質問は新しいバージョンですでに修正されています。ありがとう。
m3nda

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


私はむしろ企業内のパスワードなしのログインを有効にするinconvenientsのために、sshpassに固執するだろう
ローマRdgz

これを試しましたか:sshpass -p 'mypass' ssh username@server.example.com
koni_raid

「mypass」と「mypass」のどちらを使用しても問題ありません。それは永遠に待っています
ロマンRdgz

sshpass -Vは機能しますか?
koni_raid

「このプログラムはフリーソフトウェアであり、GPLの条件の下で配布できます。詳細については、COPYINGファイルを参照してください」と印刷されます。そして、(私は、だけでなく、タイピングsshpass -V処理していたコマンドの先頭に-Vを追加しようとした)その実行を終了し、他には何もしません
ローマRdgz

1

それを行うには多くの方法がありますが、ここに私の提案された解決策があります:

まず、変数にパスワード保存すると、より柔軟なコマンドが提供されます。sshpassそのためのオプションがあります:

-e:このオプションを使用すると、$SSHPASS環境変数からパスワードを読み取ることができます

この変数を設定するには2つの方法があります。

  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/known_hostssshpassで接続できるようになる前にファイルにアクセスするには、接続しているマシンのRSAキーを取得するために、少なくとも1回は手動でsshで接続する必要があることに気付きました。

known_hostsファイルのエントリを取得した後、次のようなコマンドを実行できます

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

さらに、リモートマシンのsudo構成(/ etc / sudoers)から「requiretty」を削除する必要がある場合があります。


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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.