以下のシェルスクリプトを作成しました。このスクリプトは、通常のユーザーとしてリモートサーバーにログインし、ディレクトリを作成するためにルートユーザーに切り替えます。スクリプトは次のとおりです。
ssh -t [email protected] '
su root -c "
echo\"Give Directory name:\";
read dir;
mkdir\$ dir;
";
'
ここで、スクリプトは通常のユーザーのパスワードを最初に要求します。次に、rootパスワードを要求します。expect
コマンドを使用してこれを自動化するにはどうすればよいですか。 expect
で完了します。
助けてください。
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。しかし、これはあなたの質問に答えるはずです。
ルートパスワードのみを渡したい場合は、
ssh -t [email protected] …
私は数年後に受け入れられた答えを見ないので、他の人に役立つかもしれない何かを追加します。私の状況はSSHとは何の関係もありませんでしたが、次の方法でspawn expectを使用すると、動作させることができました。
expect -c "
spawn myProc
expect \"Do you wish to continue with XYZ? (y/N)\" {
send \"n\r\"
exp_continue
}
"
お役に立てれば。