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

标签 bash ssh scripting expect

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

#!/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/

相关文章:

emacs - 使用 ssh 配置的 emacs 中的 TRAMP 模式

security - 通过SSH查找/替换根目录中的所有文件

从 bash 脚本运行查询时 MySQL 复制不起作用

linux - BASH-计算同一行中某些字段的平均值

linux - 如何在将 "tee"与管道一起使用时将标准错误写入文件?

git - 如何从第一个 github 帐户切换到第二个?

c - 用于测试命令行程序的 Shell 脚本

javascript - 检查另一个 &lt;script&gt; block 中的 JS 变量值

scripting - F# 以编程方式运行 .fsx 脚本文件

linux - 如何从文件的每一行中获取元素,并将它们添加到不同文件的每一行中的每个条目之前?