我希望用户能够安装我的命令行工具......
https://github.com/occam-proof-assistant/Open-CLI
...全局安装并通过输入 来从终端运行它open
。NodeJS 包管理器npm
提供了此功能,可在您全局安装包时创建必要的符号链接。因此在目录中/usr/bin
,我看到确实已创建以下符号链接:
open -> ../lib/node_modules/occam-open-cli/open.js
但是,这只有当我是 root 时才有效,否则我会得到:
Couldn't get a file descriptor referring to the console
我知道这是什么,大概是这样。如果我输入openvt
,我会得到同样的消息。
因此,我需要能够删除允许openvt
使用 调用的别名或其他任何内容。我认为这是一件安全的事情,因为如果您愿意,open
您可以随时返回到键入。openvt
但是,我不知道该怎么做。我以为有某种别名,但输入unalias open
无效。
那么这个神秘的命令、别名、符号链接或什么的是什么/在哪里open
?我如何安全地删除它,并建议其他人也这样做?
答案1
/bin/open
在您的系统中,优先于的原因/usr/bin/open
大概是在您的 PATH 中/bin
位于 之前/usr/bin
。要检查您的 PATH,您可以运行echo $PATH
。元素之间用冒号分隔。
sudo
当你使用(我假设)运行open
或启动运行它的 root shell时,你得到了你想要的命令,因为sudo
它使用它自己的 PATH,定义/etc/sudoers
为secure_path
,在我的系统上是
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
正如您所见,/usr/bin
在 之前/bin
。
我认为您的发现很奇怪,因为据我所知,/usr/bin
通常出现在之前/bin
。您的用户可能不会遇到与您相同的问题。
但是,为了安全起见,您可以将程序安装在中/usr/local/bin
,它应该始终位于用户的 PATH 之前/usr/bin
和/bin
之中,以便本地构建的软件优先于具有相同名称的其他命令。
更安全,因为steeldriver 建议,让您的用户(或您的安装脚本)在 shell 配置文件(例如)中为您的工具定义一个别名~/.bashrc
。别名始终优先于其他命令。通过在您的命令中放置别名,~/.bashrc
您可以确保只有交互式 shell 才能识别它,并且不会干扰其他程序。
如果程序尝试执行/bin/open
预期,则删除符号链接可能会导致问题openvt
,并且可能不可靠,正如steeldriver指出的那样,因为在提供它的软件包更新或重新安装时(即相当不可预测),符号链接可能会被重新创建。
答案2
事实上目录open -> openvt
中有一个符号链接/bin
。删除此链接可以解决问题。但是,正如其他地方提到的,迄今为止最好的解决方案是创建文件别名.bashrc
...
导航到您的主目录:
cd ~
编辑您的.bashrc
(这里我已经使用过nano
但还有很多选项):
nano .bashrc
将以下内容放在某处(例如在脚下):
alias open='/usr/lib/node_modules/occam-open-cli/open.js'
您可以通过键入来重新加载文件source .bashrc
,这样就可以了,而不会影响其他任何内容。