对于想要回复我应该使用SSH密钥的人请弃权
我正在尝试在bash脚本中使用expect来提供SSH密码。提供密码是有效的,但我不会像我应该的那样在SSH会话中结束,它会回到海峡。
我的剧本:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com'
expect "password"
send "$PWD\n"
EOD
echo "you're out"
我的脚本输出:
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
usr@$myhost.example.com's password: you're out
我想拥有我的SSH会话,只有当我退出它才能返回我的bash脚本。 我之前使用bash的原因是因为我使用了一个菜单,我可以选择连接哪个单元。
由于
答案 0 :(得分:75)
混合bash和expect不是达到预期效果的好方法。我试着只使用Expect:
#!/usr/bin/expect
eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
#use correct prompt
set prompt ":|#|\\\$"
interact -o -nobuffer -re $prompt return
send "my_password\r"
interact -o -nobuffer -re $prompt return
send "my_command1\r"
interact -o -nobuffer -re $prompt return
send "my_command2\r"
interact
bash的示例解决方案可能是:
#!/bin/bash
/usr/bin/expect -c 'expect "\n" { eval spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com; interact }'
这将等待进入和返回(暂时)交互式会话。
答案 1 :(得分:51)
最简单的方法是使用 sshpass 。这在Ubuntu / Debian repos中可用,您不必处理将expect与bash集成。
一个例子:
sshpass -p<password> ssh <arguments>
sshpass -ptest1324 ssh user@192.168.1.200 ls -l /tmp
上述命令可以轻松地与bash脚本集成。
注意:请阅读man sshpass
中的安全注意事项部分,以全面了解安全隐患。
答案 2 :(得分:18)
在您的EOD之前添加'interact'prepect命令:
#!/bin/bash
read -s PWD
/usr/bin/expect <<EOD
spawn ssh -oStrictHostKeyChecking=no -oCheckHostIP=no usr@$myhost.example.com
expect "password"
send "$PWD\n"
interact
EOD
echo "you're out"
这可以让您与远程计算机进行交互,直到您退出为止。然后你会回到bash。
答案 3 :(得分:13)
在寻找问题答案数月之后,我终于找到了一个非常好的解决方案:写一个简单的脚本。
#!/usr/bin/expect
set timeout 20
set cmd [lrange $argv 1 end]
set password [lindex $argv 0]
eval spawn $cmd
expect "assword:"
send "$password\r";
interact
将它放到/usr/bin/exp
,然后您可以使用:
exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
完成!
答案 4 :(得分:7)
一个简单的期望脚本
class Movies_showdata extends Model {
protected $fillable = ['show_id', 'showdata_rate', ...other fillable fields ];
}
示例:
#!/usr/bin/expect
set user [lindex $argv 1]
set ip [lindex $argv 0]
set password [lindex $argv 2]
spawn ssh $user@$ip
expect "password"
send "$password\r"
interact
答案 5 :(得分:6)
使用帮助工具fd0ssh
(来自hxtools,而不是pmt),它可以正常工作,而不必期望来自ssh程序的特定提示。
答案 6 :(得分:6)
还要确保使用
send -- "$PWD\r"
相反,因为以短划线( - )开头的密码将失败。
上面不会解释以短划线开头的字符串作为发送命令的选项。
答案 7 :(得分:4)
我发现使用bash脚本中的 small expect脚本有用的另一种方法如下。
...
bash-script start
bash-commands
...
expect - <<EOF
spawn your-command-here
expect "some-pattern"
send "some-command"
...
...
EOF
...
more bash commands
...
这可行,因为...If the string "-" is supplied as a filename, standard input is read instead...
答案 8 :(得分:0)
sshpass
,则它会损坏。可以使用sshpass
代替passh
:https://github.com/clarkwang/passh
使用sshpass
,您可以这样做:
sshpass -p ssh user@host
使用passh
,您可以这样做:
passh -p ssh user@host
注意:请不要忘记使用-o StrictHostKeyChecking=no
,否则连接将在您第一次使用时挂起。例如:
passh -p ssh -o StrictHostKeyChecking=no user@host
参考文献: