Linux 连接后无法在主机上正确运行脚本
我不熟悉linux脚本。请帮忙。我在下面搜索了很多,但没有找到合适的答案: 我正在尝试制作一个脚本,稍后我会将其安排为cronjob,以便它在后端继续运行,并将结果存储在一个文件(比如test.txt)中 脚本的要点如下:Linux 连接后无法在主机上正确运行脚本,linux,shell,ssh,Linux,Shell,Ssh,我不熟悉linux脚本。请帮忙。我在下面搜索了很多,但没有找到合适的答案: 我正在尝试制作一个脚本,稍后我会将其安排为cronjob,以便它在后端继续运行,并将结果存储在一个文件(比如test.txt)中 脚本的要点如下: 它通过ssh连接到主机,然后在该主机上运行一些命令并将结果保存在文件中。该脚本已成功连接到主机,但未在主机上自动运行命令。脚本如下: 所以我根据其中一个答案更新了我的脚本。。如下- #!/usr/bin/expect -f spawn ssh aspen expect "p
#!/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上保存完整的输出。第二件事是,我希望这个输出文件在我自己的系统上,而不是在主机上。任何帮助都将非常有用。请不要将expect与ssh一起使用。尤其不要用它来提供密码
#!/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"
无论何时需要脚本化ssh会话,都应该使用。然后,您可以将命令直接发送到ssh的标准输入或作为参数传递。或者,更好的是,通过
.ssh/authorized_keys
中的命令
选项在服务器上定义命令,这更安全,因为即使有人获得了密钥(不能用密码保护),他们也无法运行任何其他命令。请不要将expect与ssh一起使用。尤其不要用它来提供密码
#!/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会话,都应该使用。然后,您可以将命令直接发送到ssh的标准输入或作为参数传递。或者,更好的是,通过.ssh/authorized_keys
中的命令
选项在服务器上定义命令,这更安全,因为即使有人获得了密钥(不能用密码保护),他们也无法运行任何其他命令
#!/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
运行方式:
./ssh.exp root toor localhost 22 ./home/target/Script.sh >>test.txt
运行下面的脚本。它将以用户身份ssh到aspin
user
。整个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
系统将提示您输入密码短语。如果您不想使用expect,可以使用空的密码短语。下一步是将公钥复制到user@aspin:~/.ssh/以便您可以使用私钥来证明自己
$ ssh-copy-id user@aspin
您现在应该可以登录而无需询问密码。下面是您的本地脚本在使用基于rsa密钥的身份验证而不使用密码短语时的外观
#!/bin/bash
ssh user@aspin "/home/target/Script.sh" >> test.txt
有关expect和远程登录的更多信息,请查看:运行下面的脚本。它将以用户身份ssh到aspin
user
。整个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
系统将提示您输入密码短语。如果您不想使用expect,可以使用空的密码短语。下一步是将公钥复制到user@aspin:~/.ssh/以便您可以使用私钥来证明自己
$ ssh-copy-id user@aspin
您现在应该可以登录而无需询问密码。下面是您的本地脚本在使用基于rsa密钥的身份验证而不使用密码短语时的外观
#!/bin/bash
ssh user@aspin "/home/target/Script.sh" >> test.txt
有关expect和远程登录的更多信息,请查看:我认为您需要删除“interact”并只发送剩余的命令。我认为您需要删除“interact”并只发送剩余的命令。谢谢!它起作用了。但我仍然有一些问题。1.)它不会在test.txt上保存完整的输出2.)这个test.txt是在主机上生成的&我希望它在我自己的系统上。。请帮忙@普拉尚特:把重定向移到外面就行了。但整个事情都错了。Ssh不接受来自脚本的密码,以阻止在脚本中存储密码的不安全做法。别这么做,唐克斯!它起作用了。但我仍然有一些问题。1.)它不会在test.txt上保存完整的输出2.)这个test.txt是在主机上生成的&我希望它在我自己的系统上。。请帮忙@普拉尚特:把重定向移到外面就行了。但整个事情都错了。Ssh不接受来自脚本的密码,以阻止在脚本中存储密码的不安全做法。不要这样做。我经常想知道密码短语的好处。如果您使用一个,那么您的自动远程登录脚本需要使用expect。而且,如果攻击者可以读取您的~/.ssh/id_rsa私钥,他们可以读取您的expect脚本,或者可能安装密钥笔划记录器。@KeithReynolds:ssh不接受脚本中的密码或密钥密码短语。脚本应该使用单一用途的无密码密钥,最好限制在服务器端(通常通过命令)。密码短语适用于交互使用的密钥,其中公钥身份验证仍然比密码身份验证更安全。Expect是其自身有限的脚本语言。关于使用密码短语或密码,请注意,我说过“如果您使用密码短语或密码短语,那么您的自动远程登录脚本需要使用expect。”因此,如果您需要使用ssh和密码短语编写远程登录脚本,隐式的是ssh不接受来自bash的密码短语或密码。我经常想知道密码短语的好处。如果您使用一个,那么您的自动远程登录脚本需要使用expect。而且,如果攻击者可以读取您的~/.ssh/id_rsa私钥,他们可以读取您的expect脚本,或者可能安装密钥笔划记录器。@KeithReynolds:ssh不接受脚本中的密码或密钥密码短语。脚本应该使用单一用途的无密码密钥,最好限制在服务器端(通常通过命令)。密码短语适用于交互使用的密钥,在这种情况下,公钥身份验证仍然是安全的