【问题标题】:"Aliasing" of Commands with Arguments [duplicate]带参数的命令的“别名”[重复]
【发布时间】:2016-02-08 15:24:32
【问题描述】:

我知道有些命令可以通过shell来别名,比如

alias mv="cp"

但我想做一些类似的事情,但有参数(是的,我见过other question,但我的问题略有不同)。类似于:

sshkill() {
  service sshd restart 
}
alias sshkill="killall sshd"

但这显然行不通。

我希望防止用户直接杀死 sshd(至少是意外)并使其重新启动(这是针对不止一次发生这种情况的服务器)。那么,除了aliasing,有没有办法防止命令killall sshd被执行而不是执行service sshd restart

【问题讨论】:

  • 顺便说一句,可以将适当的进程监督系统(runit、daemontools、supervisord、upstart、systemd、launchd 等)设置为在 sshd 因任何原因死亡时自动重启,或者 @ 987654326@ 或其他 - 由于此类工具可以使用waitpid(),因此它们可以比基于轮询的解决方案更有效地执行此操作。我建议使用一个。 :)
  • @CharlesDuffy 一切为了提高效率。 \o/ 我会确保调查一下,谢谢!

标签: bash alias


【解决方案1】:

你要拦截killall,所以:

killall() {
  if [ "$1" = "sshd" ]; then
    echo "some warning message, and perhaps service sshd restart"
  else
    command killall "$@"
  fi
}

【讨论】:

  • 我建议command killall "$@",而不是/path/to/real/killall "$@";这样你仍然可以获得常规的 PATH 查找,使函数更便携。
  • @CharlesDuffy:修正。我很高兴我学到了一些东西。谢谢。
  • (另请参阅我在链接问题的答案中提供的第二个解决方案,它允许某人为他们想要覆盖的每个子命令定义一个函数 - 例如,killall_sshd;这样定义killall 的包装器可以与被覆盖的特定子命令分离)。
  • 我今天学到的:你必须把它放在 root .bashrc 中,因为 sudo 是卑鄙的。 :我
猜你喜欢
  • 2020-07-19
  • 2011-10-05
  • 2015-01-29
  • 1970-01-01
  • 2018-12-14
  • 2018-06-19
  • 2017-06-11
  • 2014-03-10
  • 1970-01-01
相关资源
最近更新 更多