0

私の要件は、リモート マシンにログインし、このためのいくつかのフォルダーを作成することです。ユーザーからの入力としてユーザー名と pwd を取得し、シェル スクリプトを自動化しようとしています。

1.)次のコードを使用してマシンに ssh し、このマシンにログインするための予想される pwd を指定しました。

DSADMINPWD=dsadminpwd
PWD=pwd
/usr/bin/expect<<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no <username>@<remotemachineurl>
expect "password"
send "$PWD\n"
EOD

上記は正常に動作します。しかし、この後 su dsadmin を実行している間。以前に取得したパスワードからそのユーザーの内部に入ることができません。

2.) このマシン内から su dsadmin のようにユーザーを変更する必要があります。また、dsadmin のパスワードもあります。しかし、それは正しく機能していません。

    DSADMINPWD=dsadminpwd
    PWD=pwd
    /usr/bin/expect<<EOD
    spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no <username>@<remotemachineurl>
    expect "password"
    send "$PWD\n"
    EOD

    su dsadmin
    <like to make some folders in dsadmin directory>
    exit... 

su dsadmin を実行すると、次のようになります

   bash-3.00$

ここにはパスワードなどの兆候はありません。

上記から、それは機能していません

自動化されたスクリプトでパスワードを使用して ssh の後に su を作成することが可能かどうかを提案してください。どんな提案でも大歓迎です。

ありがとう!

4

1 に答える 1

0

私はずっと前にexpectコマンドを使用しましたが、sshコンソールから起動してもsuコマンドでスムーズに動作しました。

役に立つと思われるいくつかの例を次に示します。

まず、bash スクリプト:

#!/bin/bash

exec 1> stdoutfile
exec 2> stderrfile

./yourexpectscript  YOUR_REMOTEIP_HERE userexample passwordexample

次に、expect スクリプト:

#!/usr/bin/expect --

send_user "connecting to remote server\n"

set server [lindex $argv 0]
set user [lindex $argv 1]
set pass [lindex $argv 2]
set dsadminpass "dsadminpwd"

spawn ssh $user@$server
expect "password: "
send "$pass\n"

expect {
    "> " { }
    "$ " { }
    "# " { }
}

#example command in ssh shell
send "ls -lah\n"

expect {
    "> " { }
    "$ " { }
    "# " { }
    default { }
}

#su command
send "su - dsadmin\n"

expect {
    "Password: " { }
}

send "$dsadminpass\n"

expect {
    "> " { }
    "$ " { }
    "# " { }
    default { }
}

#example command in dsadmin shell
send "ls -lah\n"

#login out dsdamin shell
send "exit\n"

expect {
    "> " { }
    "$ " { }
    "# " { }
    default { }
}

#login out ssh connection
send "exit\n"

send_user "connection to remote server finished\n"
于 2013-10-12T22:10:44.710 に答える