目标:定义重击别名来启动各种命令行界面和图形用户界面打开文件时使用文本编辑器根模式从gnome-terminal
模拟器。
进步
例如,以下别名似乎可以按预期工作:
为了命令行界面,在这个例子中我使用了 Nano (官方网站):
alias sunano='sudo nano'
为了图形用户界面,在这个例子中我使用了 Xed (维基百科文章):
alias suxed='sudo xed'
他们都打开一个文件根。
问题
我有一个问题gksudo
和这个结合sublime-text
:
alias susubl='gksudo /opt/sublime_text/sublime_text'
有时有用。它只是大多数时候不做任何事情。
我如何调试这种行为不一致的事情?它不输出任何内容。没有错误消息或类似消息。
问题
gksudo
已在 Debian 中弃用,也不再包含在 Ubuntu 18.04 Bionic 中,所以让我将这个问题重新表述为一个仍然有效的问题:
如何在 Linux 的 GUI(和 CLI)中正确编辑系统文件(以 root 身份)?
适当地在这种情况下我定义为安全地例如,如果在文件编辑期间发生断电,另一个例子可能是 SSH 连接丢失等。
答案1
除非绝对必要,否则不应以 root 身份运行编辑器;你应该使用sudoedit
或sudo -e
或sudo --edit
,或您的桌面环境的管理功能。
sudoedit
一旦sudoedit
设置正确,您就可以执行以下操作
SUDO_EDITOR="/opt/sublime_text/sublime_text -w" sudoedit yourfile
sudoedit
将检查您是否被允许执行此操作,制作您可以编辑的文件的副本,而无需手动更改所有权,启动编辑器,然后,当编辑器退出时,将文件复制回来(如果已更改)。
我建议使用一个函数而不是别名:
function susubl {
export SUDO_EDITOR="/opt/sublime_text/sublime_text -w"
sudoedit "$@"
}
虽然作为杰夫·夏勒指出,您可以env
将其放入别名中并避免更改 shell 环境:
alias susubl='env SUDO_EDITOR="/opt/sublime_text/sublime_text -w" sudoedit'
$SUDO_EDITOR
请注意,如果$VISUAL
或$EDITOR
已经足够好,则不需要使用环境变量。
这-w
选项确保 Sublime Text 调用等到文件关闭后再返回并让sudoedit
文件复制回来。
桌面环境 (GNOME)
在 GNOME(也许还有其他桌面环境)中,您可以使用任何GIO/GVFS- 有能力的编辑,有admin://
方案;例如
gedit admin:///etc/shells
这将提示使用 PolKit 进行适当的身份验证,然后如果身份验证成功,则打开文件进行编辑。
答案2
不同的解决方案:我从不直接编辑系统文件,我在某处制作副本(*),编辑副本(使用我常用的编辑器),然后sudo cp
完成。
(*) 我为此有一个目录,其中所有文件都保存在一个地方:
- 自然地保留我已更改的所有文件的列表
- 易于版本
- 易于备份
- 易于转移到另一台机器