Linux 使用特定条件循环函数

Linux 使用特定条件循环函数,linux,unix,expect,Linux,Unix,Expect,我有一个功能: set timeout 20 set f [open "password.txt"] set password [read $f] close $f spawn ssh user@example.net -p 724 expect "user@example.net's password:" send $password interact 在password.txt中,我只有一个单词 在终端中使用expect运行此脚本后,如果存在的单个单词是正确的,我就可以访问服务器 我有两

我有一个功能:

set timeout 20
set f [open "password.txt"]
set password [read $f]
close $f

spawn ssh user@example.net -p 724
expect "user@example.net's password:"
send $password
interact
password.txt
中,我只有一个单词

在终端中使用expect运行此脚本后,如果存在的单个单词是正确的,我就可以访问服务器

我有两个问题:

已解决------1)我希望循环执行此脚本,以防在
password.txt
中有2,5100个单词,脚本将尝试所有单词作为密码,而不仅仅是现在的第一个

2) 如果我将使用
password.txt
,我需要使用if语句来解决此问题(尝试三次写入密码后,服务器会断开您的连接,因此您需要在每次尝试三次后重新连接。)

更新:服务器在前两次尝试(如
权限被拒绝)后回答,请重试。
在最后一次尝试(第三次)后显示
权限被拒绝(公钥、密码)。
并将我切换到正常的命令行状态

我正在尝试做一些类似的事情

while read line
 do
  echo "Trying: $line"
  echo ssh user@example.net -p 724 --password "$line" ## NOT REAL CODE
 done < password.txt
它解决了我的第一个问题,但错误是,我需要按manaul“回车”后,服务器要求的密码。在我点击“回车”后,脚本会尝试列表中的第一个单词,如果它再次出错,我需要按“回车”,脚本会尝试列表中的第二个单词


如何模拟在脚本中按“enter”键?

很高兴您能做到这一点。(删除你的评论,它们只会让人困惑。)。我觉得上面的东西虽然背景很有趣,但却掩盖了你真正的问题。2.也许可以做到这一点,但你可能会花很多时间来锻炼。3、读取pswd时只
有什么问题;如果有,就去做!嘘$pswd cmds。。。。2> &1 | grep“您的成功字符串”;然后在pswd上匹配回波=$pswd;出口0;fi;完成
,只需使用
bash
ksh
。祝你好运。@Sheller我正在努力理解你的代码,很难解释这个解决方案。谢谢我是说,不要使用
expect
。只需清理您的
bash
p-code,因为它非常接近您的需要。唯一的区别是,对文件中的每个密码重新启动
ssh
,直到找到一个有效的密码。把我的代码,并把它正确缩进的形式。你会看到逻辑。(我可能错过了很多语法,但不难理解)。就像你在p代码中写的一样<代码>sshuser@example.net-p 724——密码“$pswd”
cmds
是要在远程计算机上执行的命令。如果你只是想看到你有一个连接,你可以把
ls-l
而不是
cmds…
我必须离开,所以你必须进行实验。使用shell调试/跟踪选项
set-vx
(使用
set+vx
关闭)查看变量的解释方式。不要因为看到单引号
而感到困惑,因为您没有将它们放在跟踪输出中,这只是跟踪模式的一个显示功能。祝你好运我的安全感令人刺痛:为什么你要粗暴地强迫登录尝试?
set timeout 20
set f [open "password.txt" r]
set password [read $f]
close $f

foreach i $password {
puts "trying this as a pass : $i"
spawn ssh user@example.net -p 724
expect "user@example.net's password:"
send $i
interact
}