连接后无法在主机上正确运行脚本

时间:2014-04-16 08:53:54

标签: linux shell ssh

我是linux脚本新手。请帮忙。我在下面搜索了很多,但未能找到合适的答案:

我正在尝试创建一个脚本,我稍后将其作为cronjob进行调度,以便它继续在后端运行并将结果存储在一个文件中,如test.txt

脚本的要点如下:

  1. 它通过ssh连接到主机,然后在该主机上运行一些命令并将结果保存到文件中。脚本成功连接到主机但未在主机上自动运行命令。脚本如下:
  2.  #!/usr/bin/expect
        spawn ssh guest@host-ip
        expect "host pwd"
        send "pass123\r"
        interact
        cd /home/target/ ...                           /* goes to some specific path*/
        ./Script.sh >> test.txt                        /* runs a script on host and saves the result*/
        exit
    

    所以我根据其中一个答案更新了我的脚本..如下 -

    #!/usr/bin/expect -f
    spawn ssh aspen
    expect "password: "    
    send "PASSWORD\r"    
    expect "$ "    
    send "/bin/sh /home/target/Script.sh >>test.txt"    
    expect "$ "    
    send "exit\r"
    

    但是当我运行这个脚本时,它不会在test.txt上保存完整的输出。第二件事是我希望这个输出文件在我自己的系统上而不是在主机上。任何帮助都会很明显。

4 个答案:

答案 0 :(得分:2)

运行下面的脚本。它会像用户user一样进入aspin。整个ssh会话的输出(包括/home/target/Script.sh的输出)将附加到本地文件test.txt此外,grep strip out期望被提示输入密码。

#!/bin/bash

{
/usr/bin/expect  <<- EOF
    spawn ssh user@aspin "/home/target/Script.sh"
    expect "password:"
    send "PASSWORD\r"
    expect eof
EOF
} |grep -v  "user@apsin's password:">>  test.txt

或者,对于程序员来说,并且可以说更安全,也更简单,你应该放弃期望并使用加密密钥登录ssh,使用加密密钥证明你是谁,而不会被提示输入密码。

一步一步的过程:

$ ssh-keygen 

系统会提示您输入密码。如果您想取消使用expect,可以使用空密码。下一步是将您的公钥复制到user @ aspin:〜/ .ssh /,以便您可以使用私钥来证明自己。

$ ssh-copy-id  user@aspin

您现在应该可以登录而不会被问到您的密码。以下是您使用基于rsa密钥的身份验证和无密码

时本地脚本的外观
#!/bin/bash
ssh user@aspin "/home/target/Script.sh" >>  test.txt

有关期望和远程登录的详细信息,请查看:When to use Expect scripting and when to avoid it.

答案 1 :(得分:1)

#!/usr/bin/expect -f

spawn ssh aspen

expect "password: "

send "PASSWORD\r"

expect "$ "

send "/bin/sh /home/target/Script.sh >>test.txt"

expect "$ "

send "exit\r"

答案 2 :(得分:1)

请不要将期望与ssh一起使用。特别是不要用它来提供密码。

每当您需要脚本化的ssh会话时,您应该使用public key authentication。然后,您可以将命令直接发送到ssh的标准输入,或将它们作为参数传递。或者,更好的是,通过command中的.ssh/authorized_keys选项在服务器上定义命令,这更安全,因为即使有人拿到密钥(无法使用密码短语保护,他们将无法运行任何其他命令。

答案 3 :(得分:0)

#!/usr/bin/expect -f

if {[llength $argv] != 5} {

puts "usage: ssh.exp username password server port program"

exit 1

}

set username [lrange $argv 0 0]

set password [lrange $argv 1 1]

set server [lrange $argv 2 2]

set port [lrange $argv 3 3]

set program [lrange $argv 4 4]

set timeout 60

spawn ssh -p $port $username@$server $program

match_max 100000

expect "*?assword:*"

send -- "$password\r"

send -- "\r"

expect eof

以:

运行
./ssh.exp root toor localhost 22  ./home/target/Script.sh >>test.txt