我是linux脚本新手。请帮忙。我在下面搜索了很多,但未能找到合适的答案:
我正在尝试创建一个脚本,我稍后将其作为cronjob进行调度,以便它继续在后端运行并将结果存储在一个文件中,如test.txt
脚本的要点如下:
#!/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上保存完整的输出。第二件事是我希望这个输出文件在我自己的系统上而不是在主机上。任何帮助都会很明显。
答案 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