如何在unix shell脚本中的ssh命令中使用su命令

时间:2013-10-07 15:16:50

标签: bash shell unix ssh su

我的要求是登录到远程计算机并为此创建一些文件夹我计划将用户名和密码作为用户输入并尝试生成自动化shell脚本。

1.)我使用以下代码进入机器并给出预期的密码登录到本机。

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之后生成任何内容。任何建议都将受到高度赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

我很久以前就使用了expect命令,即使它是从ssh控制台启动的,也可以使用su命令顺利运行。

这里有一些你可以发现有用的例子。

首先是bash脚本:

#!/bin/bash

exec 1> stdoutfile
exec 2> stderrfile

./yourexpectscript  YOUR_REMOTEIP_HERE userexample passwordexample

其次是期望脚本:

#!/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"