web-dev-qa-db-ja.com

bashでexpectを使用する方法

以下のシェルスクリプトを作成しました。このスクリプトは、通常のユーザーとしてリモートサーバーにログインし、ディレクトリを作成するためにルートユーザーに切り替えます。スクリプトは次のとおりです。

ssh -t [email protected] '
su root -c "
echo\"Give Directory name:\";
read dir;
mkdir\$ dir;
";
'

ここで、スクリプトは通常のユーザーのパスワードを最初に要求します。次に、rootパスワードを要求します。expectコマンドを使用してこれを自動化するにはどうすればよいですか。 expectで完了します。

助けてください。

3
Uvais Ibrahim

Expectを使用するよりも優れた/簡単な方法はSSHPASSで、これはSSHリクエストでパスワードを送信します。

sshpass -p <PASSWORD> ssh <USER>@<SERVER> <SSH Command>

PASSWORDはプロンプトが表示されたときに入力するパスワード、USERはユーザー名、SERVERはサーバーのIPアドレス(10.8.100.100など)、SSHコマンドは実行するコマンドです。

あなたの例:

sshpass -p <PASSWORD> ssh [email protected] mkdir <full path for new dir>

SSHPASSをインストールするには:

Sudo apt-get install sshpass

SSHセッションを後で維持したい場合は、以下でexpectを使用できます。

#!/bin/bash
##Enter Username and Password Details:
userName=<UserName>
password=<Password>

expect -c "
    spawn ssh ${userName}@10.8.100.100 ##put your own IP here
    expect "password: " ##or whatever password Prompt you get
    send "$password\r"
    expect -re "Last Login: " ##or whatever the end of your welcome message is
    send "su -i"
    expect "password for <UserName>"
    send "$password\r"
"

これにより、ルートアクセスはログインしたままになりますが、スクリプトがreturnステートメントを送信するまで、ヒットするまで制御が保持されます。 Ctrl+c。しかし、これはあなたの質問に答えるはずです。

2
tim

ルートパスワードのみを渡したい場合は、

  • ユーザーアカウントへのパスワードなしのログインを設定します。クライアント側で公開鍵認証とsshエージェントを使用して、
  • または、サーバーを構成します(つまり、rootとしてログインできるようにし、ssh -t [email protected]
1
MvG

私は数年後に受け入れられた答えを見ないので、他の人に役立つかもしれない何かを追加します。私の状況はSSHとは何の関係もありませんでしたが、次の方法でspawn expectを使用すると、動作させることができました。

expect -c "  
  spawn myProc
  expect \"Do you wish to continue with XYZ? (y/N)\" {
    send \"n\r\"
    exp_continue
  }          
"

お役に立てれば。

1
Eric Hodonsky