PyGobject VTE终端执行SSH命令时重复打印问题求助
解决VTE终端中Expect命令重复打印的问题
我之前在开发类似的多服务器SSH连接工具时,也碰到过这个VTE和Expect配合的小坑,咱们一步步来排查解决:
1. 定位命令重复打印的根源
你看到的命令两次输出,大概率是VTE启动逻辑和bash交互模式初始化产生了重叠:
- 要么是你同时通过VTE启动参数传递了Expect命令,又在bash的初始化脚本(比如
.bashrc、.bash_profile)里重复调用了该命令; - 要么是VTE的启动方式错误,导致bash先执行一次命令,进入交互模式后又重复执行了一次。
2. 修正VTE的启动命令
正确的做法是让VTE启动bash实例,先执行你的Expect连接脚本,再切换到交互bash保持会话,避免重复执行。示例命令如下:
# 替换成你的实际Expect脚本路径 bash -c '/usr/local/bin/ssh-connect-expect.sh; exec bash -i'
这里的核心细节:
exec bash -i会替换当前bash进程,避免额外进程嵌套;-i强制bash进入交互模式,执行完Expect脚本后能正常操作服务器会话,不会直接退出。
3. 优化Expect脚本的输出逻辑
确保你的Expect脚本没有不必要的命令输出,比如不要把连接命令本身打印到标准输出。以下是一个标准的SSH连接Expect脚本模板:
#!/usr/bin/expect -f set timeout 10 set host [lindex $argv 0] set user [lindex $argv 1] set pass [lindex $argv 2] spawn ssh $user@$host expect { "password:" { send "$pass\r" } "Are you sure you want to continue connecting" { send "yes\r"; exp_continue } } interact
这个脚本仅处理SSH交互流程,不会额外打印连接命令。
4. 避免VTE API的重复命令发送
如果你是通过VTE编程API(比如GTK+的VTE库)开发,要注意:
- 不要同时用
vte_terminal_set_command()设置初始命令,又用vte_terminal_feed_child()发送相同命令; - 只需将上述的bash启动命令作为初始命令传递给VTE即可。
按照这个思路调整后,应该就能解决命令重复打印的问题了。
内容的提问来源于stack exchange,提问作者Dawid Respondek
相关产品推荐
相关产品推荐

