web-dev-qa-db-ja.com

bashスクリプト内からsshする方法は?

Ssh接続を作成し、スクリプト内からリモートサーバーでいくつかのことをしようとしています。

ただし、端末はパスワードの入力を要求し、スクリプトではなく端末ウィンドウで接続を開きます。接続を終了するまで、コマンドは実行されません。

Bashスクリプト内からどのようにsshできますか?

56
Andrew
  1. パスワードプロンプトを消したい場合は、キーベースの認証を使用します( ここで説明 )。

  2. Sshを介してコマンドをリモートで実行するには、次のように、sshの引数としてコマンドを指定する必要があります。

root @ Host:〜#ssh root @ www 'ps -ef | grep Apache | grep -v grep | wc -l '

64
halfdan

パスワードの使用を継続し、キー交換を使用しない場合は、次のように「expect」でこれを実現できます。

#!/usr/bin/expect -f
spawn ssh user@hostname
expect "password:"
sleep 1
send "<your password>\r"
command1
command2
commandN
17
SiegeX

共有接続を使用してそれを行う別の方法があります。つまり、誰かがパスワードを使用して接続を開始し、その後のすべての接続が同じチャネルで多重化され、再認証の必要性がなくなります。 (そして、その高速も)

# ~/.ssh/config 
ControlMaster auto
ControlPath ~/.ssh/pool/%r@%h

その後、ログインするだけで、ログインしている限り、bashスクリプトはssh接続を開くことができます。

誰かがまだチャンネルを開いていない場合、次の方法でスクリプトの動作を停止できます。

ssh ... -o KbdInteractiveAuthentication=no ....
5
Kent Fredric

必要なのは、スクリプトを実行するユーザーのSSHキーを交換することです。 このチュートリアル をご覧ください

そうすると、パスワードを入力しなくてもスクリプトが実行されます。ただし、セキュリティのために、rootユーザーに対してこれを行うのは望ましくありません。

2
Dan Soap