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'
そしてそれらのどれも動作しません。
これは、ssh
によって行われるホストキーチェックが原因である可能性があります。 sshpass
は無効なホストキーについては黙って(stderr
もstdout
も出力しない)ように見え、ステータスコード6
で存在します。これを書いている時点では、これはリビジョン50であり、コード内の一致定数は RETURN_Host_KEY_UNKNOWN
であり、これはそのエラーのヒントです。
エラーコードは異なる場合があり、上記のリンクされたコードを見ると、洞察が得られる場合があります。
問題が無効なホストキーである場合、CLIオプションでエラーを上書きすることをもう一度考える必要があります。 マシンが危険にさらされる可能性があるか、MITM攻撃の対象になる可能性があります!これが当てはまらないことを100%確信しており、検証済みのホストキーを最新の状態に保つ手段がない場合日付、次のようなコマンドを使用できます。
sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@Host command_to_run
sshpass
は、パスワードプロンプトがassword:
で終わる場合にのみ機能します。
パスワードプロンプトが異なる場合は、sshpass
のソースコードを調整して、持っているプロンプトを認識する必要があります。
一部のシステムでPassword for user@Host:
のようなパスワードプロンプトが表示されましたが、これが問題である可能性があります。
次のようなものが欲しいと思います:
sshpass -p yourpassword ssh user@ipaddress somecommand
たとえば、これは私のために働く:
sshpass -p mypassword ssh [email protected] touch foo
それを行うには多くの方法がありますが、ここに私の提案する解決策があります:
まず、変数にパスワードを保存するを指定すると、より柔軟なコマンドが提供されます。 sshpass
には次のオプションがあります。
-e
:このオプションは、$SSHPASS
環境変数からパスワードを読み取ることができます
この変数を設定するには2つの方法があります。
コードに直接設定します。
export SSHPASS='your_pass'
またはそれを求めます:
readPassword () {
echo Ssh Password:
read -s SSHPASS
eval "export SSHPASS='""$SSHPASS""'"
}
# read password
readPassword
コマンドを実行するより。
コマンドが静的な場合、直接実行します。
sshpass -e ssh user@Host << EOF
mplayer '/media/data/myFavouriteSong.mp3'
command2 parameter1 parameter2 parameter3 ...
command3 parameter1 parameter2 parameter3 ...
...
EOF
コマンドが次のように動的に使用される場合:
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'
これが誰かを助けることを願っています。
パスワードなしのログインを設定しましたか?
OpenSSHを使用したパスワードなしのログイン http://www.debian-administration.org/articles/152
必要なのは-f -t -t -t
です
sshpass -p$PASS ssh -f -t -t -t $USER@$Host $COMMAND
さらに、リモートマシンのSudo構成(/ etc/sudoers)から「requiretty」を削除する必要がある場合があります。
sshpass
は擬似端末を使用し、man
ページには時々壊れる謝罪が含まれています。 fd0ssh
を試すこともできます。リモートマシンのプロセスにstdin
を送信する必要がない場合に機能します。コマンドを発行して結果をキャプチャするだけで機能します。
@exhumaには、それが私のために働くことにつながる例がありました。
パスワードは-pPassword
(スペースなし)の形式である必要があります
引用符も必要になる場合があります:sshpass -p'Password&0' user@hostname
キーを作る
ssh-keygen -t rsa
リモートサーバーに.sshフォルダーを作成し、パスワードを要求します
ssh $USER@SEVERNAME mkdir -p .ssh
キーをリモートサーバーにコピーする
cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'
パスワードを要求するかどうかを確認し、要求しない場合は機能します。
ssh $USER@SEVERNAME 'command'
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
コマンドを実行し、ローカルマシンの標準出力に結果を出力します。