gpt4 book ai didi

bash - 从终端输出中删除发送命令,同时保留所需的输出

转载 作者:行者123 更新时间:2023-12-02 14:38:06 25 4
gpt4 key购买 nike

我正在尝试创建一个脚本,该脚本将登录到服务器,并在向用户提供信息的同时运行一些命令。
我可以使用脚本正常登录到服务器,我的问题是我得到的输出。我的脚本是这样的:

#!/bin/bash

/usr/bin/expect << SSHLOGIN

set timeout 600

spawn ssh user@myServer.com
expect {
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\n";exp_continue
}
Password: {
send "$2\n"
}
}
expect {
"# " {
send "echo \"Current Directory is:\" \n"
}
}
expect "# " {
send "pwd \n"
}
expect {
"# " {
send "exit \n"
}
}
wait
SSHLOGIN

我的输出如下:
spawn ssh user@myServer.com
Password:
You have new mail.
DISPLAY set to user.myServer:0.0
# echo "Current Directory is:"
Current Directory is:
# pwd
/home/user/

我试图实现的输出如下所示:
spawn ssh user@myServer.com
Password:
You have new mail.
DISPLAY set to user.myServer:0.0
Current Directory is:
/home/user/

我尝试使用log_user 0/1,stty等。但是我似乎无法正确地使用这些...

任何帮助,将不胜感激。

最佳答案

问题在于产生的进程的std输出包括程序输出和已发送命令,后者仅是由于远程设备的回显。

您可以通过log_user命令来操作stdout,在仍然期望和捕获的情况下将其关闭,并通过“puts”命令自己打印输出。最后,如果需要的话,重新启用。之所以如此,是因为Expect直到Expect命令才读取回显的命令。

我现在无法进行测试,因此我将让您保留正则表达式以匹配pwd输出(提防带有当前路径的提示),但是由于您的问题不是正则表达式,因此我认为以下内容将为您效劳:

#!/bin/bash

/usr/bin/expect << SSHLOGIN

set timeout 600

spawn ssh user@myServer.com
expect {
"Are you sure you want to continue connecting (yes/no)?" {
send "yes\n";exp_continue
}
Password: {
send "$2\n"
}
}
expect {
"# " {
send "pwd \n"
log_user 0
expect -re "(include_here_between_the_parenthesis_a_regexp_that_matches_your_pwd_output)" {
puts "Current directory is: $expect_out(1,string)"
}
log_user 1
}
expect {
"# " {
send "exit \n"
}
}
wait
SSHLOGIN

作为最后的评论...为什么不将顶行更改为#!/ usr / bin / expect并将其设置为一个期望脚本,而不是将bash与此处的documnet(或任何所谓的)一起运行?毕竟,这几乎是纯期望代码。

让我知道如何进行,如果确实有帮助,请不要忘记投票或标记答案。 :-)

关于bash - 从终端输出中删除发送命令,同时保留所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22202607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com