web-dev-qa-db-ja.com

sshpassの使用方法

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

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

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
Roman Rdgz

これは、sshによって行われるホストキーチェックが原因である可能性があります。 sshpassは無効なホストキーについては黙って(stderrstdoutも出力しない)ように見え、ステータスコード6で存在します。これを書いている時点では、これはリビジョン50であり、コード内の一致定数は RETURN_Host_KEY_UNKNOWN であり、これはそのエラーのヒントです。

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

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

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@Host command_to_run
28
exhuma

sshpassは、パスワードプロンプトがassword:で終わる場合にのみ機能します。

パスワードプロンプトが異なる場合は、sshpassのソースコードを調整して、持っているプロンプトを認識する必要があります。

一部のシステムでPassword for user@Host:のようなパスワードプロンプトが表示されましたが、これが問題である可能性があります。

5
rjs

次のようなものが欲しいと思います:

sshpass -p yourpassword ssh user@ipaddress somecommand

たとえば、これは私のために働く:

sshpass -p mypassword ssh [email protected] touch foo
2
benofben

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

まず、変数にパスワードを保存するを指定すると、より柔軟なコマンドが提供されます。 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'
    

これが誰かを助けることを願っています。

1
veysiertekin

パスワードなしのログインを設定しましたか?

OpenSSHを使用したパスワードなしのログイン http://www.debian-administration.org/articles/152

1
koni_raid

必要なのは-f -t -t -tです

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

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

0
Ehsan

sshpassは擬似端末を使用し、manページには時々壊れる謝罪が含まれています。 fd0sshを試すこともできます。リモートマシンのプロセスにstdinを送信する必要がない場合に機能します。コマンドを発行して結果をキャプチャするだけで機能します。

0
Bruce

@exhumaには、それが私のために働くことにつながる例がありました。

パスワードは-pPassword(スペースなし)の形式である必要があります

引用符も必要になる場合があります:sshpass -p'Password&0' user@hostname

0
user3367115
  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
VeggieVampire

sshpass構文は

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

-pとパスワードの間にスペースがないことに注意してください。

また、sshpassで接続できるようになる前に、~/.ssh/known_hostsファイルにアクセスするために、接続しているマシンのRSAキーを取得するために、少なくとも1回手動でsshで接続する必要があることに気付きました。

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

sshpass -ffilename_with_password_in_it ssh user@server uname -a

そして、リモートサーバーでuname -aコマンドを実行し、ローカルマシンの標準出力に結果を出力します。

0
BeowulfNode42