有没有办法在执行之前操纵终端输入?例子:
apt-get update
在终端中输入。现在我想将其更改为sudo apt-get update
执行之前。
我尝试过的:
我考虑过执行一个脚本的可能性,然后该脚本将使用操纵的输入执行输入的命令,但我没有找到一种在执行另一个程序时运行该脚本的方法。
我很感激每一个答案。我使用的是 Linux Mint Serena。
澄清:
每当调用命令时,都应该有一个脚本或任何内容在后台运行,并检查它是否与模式匹配。如果否,则执行输入,如果是,则操纵该命令并执行 -> 这就是我的示例使用apt-get update
to 的原因sudo apt-get update
。我唯一能弄清楚的是,该脚本如何在执行之前获取该命令。
可能的目的:
当尝试访问特定文件/目录时,请输入密码提示
创建快捷方式(
cd _1
将更改为cd ~/Desktop
)
答案1
在 中zsh
,您可以添加一些检查器来执行以下操作:
validate_apt-get_update() {
local match MATCH MBEGIN MEND mbegin mend
if [[ $BUFFER =~ '^(\s*)(apt-get\s+update.*)' ]]; then
LBUFFER="$match[1]sudo " RBUFFER=$match[2]
zle -M 'WARNING: sudo has been added before apt-get update'
return 1
fi
}
accept-line() {
validate_apt-get_update && zle .accept-line
}
zle -N accept-line
它将插入sudo
,将光标定位在其后面,给您一条警告消息,并且如果您输入的前两个单词是apt-get
and update 的行则不接受该行,让您有机会检查它是否确实是您想要的。
在这里,我们正在对 shell 命令行进行自己的简化解析。如果您输入以下内容,它将不起作用:
'apt-get' update
"$(echo apt-get)" update
something else; apt-get update...
这可能也不错,因为这允许你这样做:
\apt-get update
如果您想绕过该检查,就像您想绕过别名一样。
对于你的cd _1
那成为cd ~/Desktop
,你可以这样做:
set -o cdable_vars
_1=~/Desktop
就我个人而言,我不太喜欢 shell 在我背后做这样的事情(尤其是其他人至少不会期望的事情)。
答案2
呃,一些全新的东西(对我来说):阅读使用 PS4 的答案:如何拦截每条命令
如果刚刚测试过:
bash: PS4='$(echo $(date) $(history 1) >> /tmp/trace.txt) TRACE: '
bash: set -x
bash: date
TRACE: date
Fr 28. Jul 14:13:24 CEST 2017
正如上面的回答所述,PS4...针对正在执行的每个命令进行评估...。因此,如果您替换它以通过包装器传递任何命令并验证执行,这样您就可以拦截任何你的命令。
答案3
根据您的 shell,您可以创建一个alias
(维基百科有概念的详细信息)。
要在 bash 中创建永久别名,您可以将其添加到您的 中.bashrc
,您可以像这样编辑:gedit ~/.bashrc
然后,您只需在底部添加一行,例如:
alias apt-get-update='sudo apt-get update'
请注意,除非用破折号或下划线将它们连接起来,否则用多个单词创建别名将不起作用。
答案4
如果仅用于您的登录,您可以编写一个在系统命令之前执行的包装脚本。要让包装器在系统命令之前执行,您必须修改 PATH 变量。
例如:
为您的包装器创建路径:
mkdir $HOME/wrapper
前置您的 PATH 包装路径(例如 inside
$HOME/.bashrc
):export PATH="/home/myuser/wrapper:$PATH`
示例脚本
$HOME/wrapper/ls
:#!/bin/bash echo "sudo ls $*"
现在执行看起来像这样:
stackoverflow: ls /home
sudo ls /home
出于安全原因,请注意其他人无法修改您的包装器脚本,因此不要以sudo
特权执行黑客脚本。不这样修改 PATH 变量有几个原因。
如果您在系统范围内执行此操作(修改/etc/profile
PATH 并将包装器放置在内部/usr/wrapper
),那么它是非常请务必注意,任何人都不得将自己的文件放入其中!