这GNU 屏幕screen
实用程序具有将键绑定到命令或宏的巧妙功能。该stuff
命令特别方便在键入时将某些缩写扩展为其他字符串。
例如如果我在screen
并使用我的元键(默认为 [ Ctrl- A])后跟:bindkey -t #@@ stuff "set -o vi; bind C-l:clear-screen C-i:complete"
...,那么即使我使用共享帐户(例如当我尝试排除故障或修复时,也##@
可以快速将 shell 的设置更改为我的偏好)。bash
sudo
这很好,您可以将这些绑定添加到您的~/.screenrc
文件中。
但是如果您想为更敏感的内容制作宏...例如密码...那么您可能需要在正在运行的screen
会话中添加键绑定,而不将内容存储在任何地方的任何文件中。
你是怎样做的?
screen -X
您可能认为使用接受命令的 (大写 X) 开关很容易。但显然这样做的尝试失败了:
screen -X 'bindkey -t #@p stuff mysecretpasswordhere'
然后screen
状态栏会短暂亮起并显示错误,例如-X:未知命令...
为什么该错误信息如此没用?
答案1
我已经弄清楚了好几次了。第一次是在几年前,我用了很长时间。然后今天早上我不得不再次弄清楚。这就是我在这里发布它的原因。这样下次我需要它时就可以更容易地找到它,如果我记不清了。
问题是 -X 不接受和解析单个参数作为整个命令。它要求您将命令的每个元素作为单独的参数传递给命令screen
行。
因此这是可行的:
screen -X bindkey -t '#@p' stuff "mysecretpasswordhere"
...这是我在 shell 脚本中使用它的方法:
#!/bin/bash
read -sp "GNU Screen PW Setting:" pw
echo
screen -X 'bindkey' '-t' '#@p' 'stuff' "$pw"
然后,当我开始一个新的 GNUscreen
会话(通常每隔几个月一次)时,我只需运行~/bin/setpw
即可将密码存储在内存中,而无需将其写入任何地方的任何文件中。
(是的,我绑定的实际按键序列已经为这篇帖子进行了净化。呃!而且,是的,我非常坚持在我的系统上使用屏幕锁定,并且密码很长,很强大,因此整天都在提示符下输入相当不方便sudo
)。