操纵终端输入

操纵终端输入

有没有办法在执行之前操纵终端输入?例子:

apt-get update在终端中输入。现在我想将其更改为sudo apt-get update执行之前。

我尝试过的:

我考虑过执行一个脚本的可能性,然后该脚本将使用操纵的输入执行输入的命令,但我没有找到一种在执行另一个程序时运行该脚本的方法。

我很感激每一个答案。我使用的是 Linux Mint Serena。

澄清:

每当调用命令时,都应该有一个脚本或任何内容在后台运行,并检查它是否与模式匹配。如果否,则执行输入,如果是,则操纵该命令并执行 -> 这就是我的示例使用apt-get updateto 的原因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-getand 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 变量。

例如:

  1. 为您的包装器创建路径:

    mkdir $HOME/wrapper
    
  2. 前置您的 PATH 包装路径(例如 inside $HOME/.bashrc):

    export PATH="/home/myuser/wrapper:$PATH`
    
  3. 示例脚本$HOME/wrapper/ls

    #!/bin/bash
    echo "sudo ls $*"
    

现在执行看起来像这样:

stackoverflow: ls /home
sudo ls /home

出于安全原因,请注意其他人无法修改您的包装器脚本,因此不要以sudo特权执行黑客脚本。不这样修改 PATH 变量有几个原因。

如果您在系统范围内执行此操作(修改/etc/profilePATH 并将包装器放置在内部/usr/wrapper),那么它是非常请务必注意,任何人都不得将自己的文件放入其中!

相关内容