如何使粘贴的 shell 命令不可见?

如何使粘贴的 shell 命令不可见?

我正在使用 AutoHotkey 宏来运行一些 shell 命令,IE

^`::
SendInput set c=".cshrc-acheong"{ENTER}
SendInput set v=".vimrc-acheong"{ENTER}
SendInput foreach d ( /home/acheong /home/tcama /userhome/andrew.cheong ){ENTER}
SendInput if ( -e $d/$c ) source $d/$c{ENTER}
SendInput if ( -e $d/$v ) alias vim "vim -N -u $d/$v"{ENTER}
SendInput end{ENTER}
return

如果您不熟悉 AutoHotkey,没问题 — 这与一次粘贴多行 shell 命令相同 — 我们中的许多人都已经看到命令提示符如何在每行执行时“异步”出现:

在此输入图像描述

stdin是否有隐藏(可能是阻塞)然后执行输入而不显示它(或其输出)的命令或技巧?有点像输入密码。


请不要对上述内容作出判断:-(先发制人地否认某些事情:

  1. 我不会csh选择使用;是的,我读过前十名。

  2. 我使用数百台服务器,这些服务器并不都安装相同的网络共享/home- 这就是为什么我使用rsync将“主服务器”推送到.cshrc每个.vimrc不同网络共享的位置,以便上面的键盘宏将找到并加载无论我在哪里都可以找到。


更新

我尝试添加stty -echoIE

^`::
SendInput stty -echo{ENTER}
SendInput set c=".cshrc-acheong"{ENTER}
SendInput set v=".vimrc-acheong"{ENTER}
SendInput foreach d ( /home/acheong /home/tcama /userhome/andrew.cheong ){ENTER}
SendInput if ( -e $d/$c ) source $d/$c{ENTER}
SendInput if ( -e $d/$v ) alias vim "vim -N -u $d/$v"{ENTER}
SendInput end{ENTER}
SendInput stty echo{ENTER}
return

但提示仍然出现:

在此输入图像描述

(我想过取消设置$prompt,但我不愿意,因为我所做的事情之一.cshrc正是替换$prompt。)

答案1

我对 AutoHotKey 不熟悉,所以如果您在那里找不到任何解决方案,请继续阅读。

POSIX 指定命令read,它允许使用 进行一行输入,同时抑制终端回显(这就是您键入时看到的内容)-s。这也是 bash 内置的,但您可以检查您的系统以查看它是否作为独立的存在。

否则,看着这里stty,您可以使用(另一个独立的)csh 来完成同样的事情:

stty -echo # turn echo off
# do your input
stty echo # turn echo back on

答案2

通过使用备用屏幕缓冲区,您可以非常接近您想要的效果。
最多(全部?)终端模拟器有 2 个屏幕缓冲区,您可以在它们之间切换。因此,您切换到备用屏幕缓冲区,运行命令,然后切换回主屏幕缓冲区。

只需在命令之前运行以下命令:

tput smcup

最后,运行

tput rmcup

但是,这仍然会tput smcup在屏幕上显示该命令。
我能想到隐藏命令的唯一方法是为其添加键绑定(如ESC+ t)。我知道zsh可以做到这一点,但我不知道csh


如果您没有该tput命令,您可以回显原始转义码。
对于腻子来说,这将是:

echo -e '\e[?47h'

echo -e '\e[2J\e[?47l'

答案3

您应该在两台机器之间mkfifo进行双向|pipe写入,而不是依赖于粘贴到腻子终端。但如果你必须使用putty,那么你应该在设置中关闭它的流量控制并使用原始模式——stty raw在主机端并在putty的设置中找到原始终端选项。

相关内容