我基本上是从命令行询问用户管理(例如,在没有可用图形工具的系统上)。在过去,我已经使用了几种不同的方案,以添加或删除用户和组或修改其属性:adduser
,useradd
,usermod
,gpasswd
,也许还有其他我忘了。我也多次听说这些程序中的一些是低级的,应该避免用于一般用途,但我永远记不起是哪个。所以我想得到一个明确的答案,哪些程序是推荐的程序,至少用于以下任务:
我正在寻找可以在几乎任何 Linux 系统(任何发行版)上使用的标准工具。
我不小心通过运行对我的 Web 服务器造成了未知数量的破坏
sudo chown -R myuser:mygroup * .*
Run Code Online (Sandbox Code Playgroud)
in /var/www
,不记得.*
会包括父目录(as ..
)。大约一秒钟后,我意识到发生了什么,但为时已晚,其中一半的目录/var
已“重新拥有”。我知道我可以用
sudo chown -R root:root /var
Run Code Online (Sandbox Code Playgroud)
但是有哪些文件需要由我必须手动更改的特定非 root 用户(或组)拥有?
这是在 Gentoo 上,这是一个目录列表:
$ ls -l /var
drwxr-xr-x 9 root root 4096 May 12 2009 cache
drwxr-xr-x 4 root root 4096 Aug 20 22:49 db
drwxr-xr-x 3 root root 4096 Aug 20 22:42 dist
drwxr-xr-x 4 root root 4096 Nov 1 2009 edata
drwxr-xr-x 2 root root 4096 Jun 17 2008 empty
drwxr-xr-x 5 …
Run Code Online (Sandbox Code Playgroud) 我遇到过几次的情况:我有一个 shell 函数,它进行一些设置,然后调用或多或少的任意命令,如下所示:
setup_and_run() {
some_setup_commands
"$@"
}
Run Code Online (Sandbox Code Playgroud)
我想改变这个函数来编写一个脚本文件,我可以在完成相同的设置后使用它重新运行命令。我可以执行以下操作,这在命令中没有带空格或其他奇怪内容的参数时有效:
setup_and_run() {
some_setup_commands
cat >>rerun.sh <<EOF
some_setup_commands
$@
EOF
"$@"
}
Run Code Online (Sandbox Code Playgroud)
有没有一种标准的方法来改变这一点,以便脚本得到正确的引用,一般来说,即使某些参数有空格或其他特殊字符?
例如,对于 的第二个定义setup_and_run
,如果我运行
$ setup_and_run ls "my cat's \"password\""
my cat's "password"
Run Code Online (Sandbox Code Playgroud)
然后rerun.sh
将包含
some_setup_commands
ls my cat's "password"
Run Code Online (Sandbox Code Playgroud)
而我希望它包含类似的东西
some_setup_commands
ls "my cat's \"password\""
Run Code Online (Sandbox Code Playgroud)
或者
some_setup_commands
ls my\ cat\'s\ \"password\"
Run Code Online (Sandbox Code Playgroud)
或者一些这样的事情。
在紧要关头,我可以将其外包给 Python 之类的东西shlex.quote()
,但我正在寻找可以在 shell 本身中完成的事情,如果可能的话,或者至少使用轻量级的标准 UNIX 工具。
我有一堆运行 Ubuntu 20.04 服务器的树莓派,我希望通过 Git 以非交互方式自动更新。
该脚本执行以下操作:
eval "$(ssh-agent -s)" ; ssh-add /home/michael/.ssh/terminal_github_deploy_key ; git -C /home/michael/terminal/src pull
Run Code Online (Sandbox Code Playgroud)
该脚本实际上是用 Python 编写的,但其作用与上面相同:
cmds = []
cmds.append('eval "$(ssh-agent -s)"')
cmds.append(f'ssh-add {HOME_DPATH}/.ssh/terminal_github_deploy_key')
cmds.append(f'git -C {CHECKOUT_DPATH} pull')
cmd = ' ; '.join(cmds)
subprocess.check_call(cmd, shell=True)
Run Code Online (Sandbox Code Playgroud)
除了引发此交互式警告之外,它工作正常:
The authenticity of host 'github.com (140.82.121.3)' can't be established.
ECDSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
Run Code Online (Sandbox Code Playgroud)
根据研究,出于安全原因,它故意不接受管道(因此yes | ...
不起作用)。我不确定是什么引发了警告,我猜测是 SSH,被 Git 调用,但不知道如何忽略它?我不必使用ssh-add
,但这就是我设法让它工作的方式。
我有一个自定义的 X11 键盘布局,可以与setxkbmap
. 但经过一番搜索后,我发现显然只有 XKB 布局文件不足以将其设置为 KDE 4 中的新键盘布局。我想让 KDE 系统识别我的自定义布局,以便我可以使用系统托盘小程序选择它,或使用系统设置模块将其安装为默认值。我需要做什么才能实现这一目标?如果它复杂,那很好,我仍然想知道涉及到什么。
我看过这个似乎相关的问题,但它显然是关于首先创建键盘布局,我已经完成了。
我看到一行 makefile 如下:
$(LAST_TARGET_DIR)/%: LFLAGS += -lpthread -lrt -Wl,-uevaluate
Run Code Online (Sandbox Code Playgroud)
在我的理解中,$(LAST_TARGET_DIR)/%
是一个目标匹配,目标之后应该是它的依赖项。为什么链接标志在这里改变?