【问题标题】:Could not run Script properly on host after connecting连接后无法在主机上正确运行脚本
【发布时间】:2014-04-16 08:53:53
【问题描述】:

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

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

脚本要点如下:

  1. 它通过 ssh 连接到主机,然后在该主机上运行一些命令并将结果保存在文件中。脚本成功连接到主机,但未在主机上自动运行命令。脚本如下:

 #!/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 上保存完整的输出第二件事是我希望这个输出文件在我自己的系统上而不是在 host 上。任何帮助都将不胜感激。

【问题讨论】:

  • 我认为您需要删除“交互”,而只需删除 send 其余命令。

标签: linux shell ssh


【解决方案1】:

最后运行下面的脚本。它将作为用户user SSH 进入 aspin。整个 ssh 会话的输出(包括 /home/target/Script.sh 的输出)将附加到本地文件 test.txt 此外,grep 会删除期望提示输入密码。

#!/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 使用加密密钥登录 aspin,无需提示输入密码即可证明您的身份。

一步一步的过程:

$ ssh-keygen 

系统将提示您输入密码。如果您想取消使用期望,您可以使用空密码。您的下一步是将您的公钥复制到 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.

【讨论】:

    【解决方案2】:
    #!/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"
    

    【讨论】:

    • 谢谢!有用 。但我还有一些问题。 1.)它没有在 test.txt 上保存完整的输出 2.)这个 test.txt 是在主机上制作的,我想在我自己的系统上。请帮忙!!
    • @prashant:只需将重定向移到外面。但整个事情都是错误的。 SSH 不接受来自脚本的密码,以阻止在脚本中存储密码的不安全做法。不要这样做。
    【解决方案3】:

    请不要将期望与 ssh 一起使用。尤其不要用它来提供密码。

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

    【讨论】:

    • 我经常想知道密码短语的好处。如果您使用一个,那么您的自动远程登录脚本需要使用 expect。而且,如果攻击者可以读取您的 ~/.ssh/id_rsa 私钥,他们就可以读取您的预期脚本或可能安装击键记录器。
    • @KeithReynolds:Ssh 不接受来自脚本的密码或密钥密码短语。脚本应该使用单一用途的无密码密钥,最好限制在服务器端(通常通过命令)。密码短语适用于交互使用的密钥,其中公钥身份验证仍然比密码安全。
    • Expect 是它自己的有限脚本语言。关于使用密码短语或密码,请注意我说过“如果您使用密码,那么您的自动远程登录脚本需要使用 expect。”因此,如果您需要使用带有密码或密码短语的 ssh 编写远程登录脚本,则隐含的事实是 ssh 不会接受来自 bash 的密码短语或密码。
    【解决方案4】:
    #!/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
    

    【讨论】:

      猜你喜欢
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-05-02
      • 2017-06-30
      • 2013-07-04
      • 2016-08-03
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多