小编Mar*_*ter的帖子

root 无法写入普通用户拥有的文件

我以普通用户身份创建一个文件testuser

$ cat > /tmp/zz
Run Code Online (Sandbox Code Playgroud)

该文件由该用户拥有(如预期):

$ ls -lA /tmp/zz 
-rw------- 1 testuser testuser 0 Feb 20 15:32 zz
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试将其截断为 时root,我的权限被拒绝:

# truncate --size=0 /tmp/zz
truncate: cannot open '/tmp/zz' for writing: Permission denied
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 时strace,我看到以下内容:

openat(AT_FDCWD, "/tmp/zz", O_WRONLY|O_CREAT|O_NONBLOCK, 0666) = -1 EACCES (Permission denied)
write(2, "truncate: ", 10truncate: )              = 10
write(2, "cannot open '/tmp/zz' for writin"..., 33cannot open '/tmp/zz' for writing) = 33
...
write(2, ": Permission denied", 19: Permission denied)     = 19 …
Run Code Online (Sandbox Code Playgroud)

shell root permissions strace

26
推荐指数
1
解决办法
6298
查看次数

ssh_config:指定登录后远程机器上执行的命令

这是我之前问题的扩展。我需要在 ssh 登录时在远程机器上运行本地存储的命令(即mount /home)。目前,我正在使用:

ssh -t mymachine.example.com 'mount /home ; /bin/bash'
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我想知道是否可以将此命令放入我的命令中,.ssh/config这样我就不必每次都输入它。我找到了一个LocalCommand选项,但我没有看到任何RemoteCommand选项。

重要的是将command-to-be-executed其存储在本地计算机上,因为它将包含打开加密磁盘的密码。这就是我无法将命令放入.profile远程机器的原因。

ssh

22
推荐指数
3
解决办法
2万
查看次数

如何在 Dash 中模拟进程替换?

在 中bash,我可以使用进程替换并将进程的输出视为保存在磁盘上的文件:

$ echo <(ls)
/dev/fd/63

$ ls -lAhF <(ls)
lr-x------ 1 root root 64 Sep 17 12:55 /dev/fd/63 -> pipe:[1652825]
Run Code Online (Sandbox Code Playgroud)

不幸的是,dash.

Process Substitution在破折号中模拟的最佳方式是什么?

我不想将输出保存为某个地方的临时文件 ( /tmp/) 然后必须删除它。有没有替代方法?

dash process-substitution

21
推荐指数
3
解决办法
2151
查看次数

/home/&lt;user&gt;/ 上的权限 755

我想知道为什么默认情况下我的目录的/home/<user>/权限设置为755. 这允许其他用户进入目录并读取我家中的文件。这有什么正当理由吗?

我可以700为我的主目录和所有子目录设置权限吗,例如:

chmod -R o-xw /home/<user>/ 
chmod -R g-xw /home/<user>/
Run Code Online (Sandbox Code Playgroud)

不破坏任何东西?

另外,是否可以在我的家中设置权限,以便创建的所有新文件都具有600和 目录700

permissions chmod files

20
推荐指数
2
解决办法
6万
查看次数

从命名管道(cat 或 tail -f)连续读取

我已配置rsyslog将某些日志事件记录到/dev/xconsole

*.*;cron.!=info;mail.!=info      |/dev/xconsole
Run Code Online (Sandbox Code Playgroud)

/dev/xconsole是一个命名管道 ( fifo)。如果我想查看正在记录的内容,我可以做cat /dev/xconsole. 我很惊讶地看到,该命令cat /dev/xconsole在读取文件后并未完成,而是充当tail -f. 换句话说,这两个命令的行为相同:

cat /dev/xconsole
tail -f /dev/xconsole
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这是为什么吗?

两者之间有什么区别吗?

pipe tail cat fifo

20
推荐指数
1
解决办法
6万
查看次数

检查 SSL 证书是否有效的脚本

我有多个 SSL 证书,我希望在证书过期时收到通知。

我的想法是创建一个cronjob,它每天执行一个简单的命令。

我知道opensslLinux中的命令可以用来显示远程服务器的证书信息,即:

openssl s_client -connect www.google.com:443
Run Code Online (Sandbox Code Playgroud)

但是我在此输出中没有看到到期日期。另外,我必须用CTRL+终止这个命令c

如何从脚本(最好使用openssl)检查远程证书的过期时间,并以“批处理模式”执行,以便它在没有用户交互的情况下自动运行?

bash cron ssl openssl certificates

18
推荐指数
3
解决办法
4万
查看次数

禁用在内核中编译的内核模块(未加载)

我的服务器有两个 1-Gbit 和两个 10-Gbit 板载网卡。

我需要完全禁用 1-Gbit 网卡,以便ifconfig -a不显示它们。

网卡使用不同的内核模块。10-Gbit 使用ixgbe,1-Gbit 使用igb

01:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
Subsystem: Dell Ethernet 10G 4P X520/I350 rNDC
Kernel driver in use: ixgbe

05:00.1 Ethernet controller: Intel Corporation I350 Gigabit Network Connection (rev 01)
Subsystem: Dell I350 Gigabit Network Connection
Kernel driver in use: igb 
Run Code Online (Sandbox Code Playgroud)

双方ixgbeigb在内核中(而不是作为一个可加载模块)静态编译。我需要使用内核启动参数禁用该模块。

我曾尝试将以下内容附加到我的内核中,但没有效果:

igb.blacklist=yes
igb.enable=0
igb.disable=yes
Run Code Online (Sandbox Code Playgroud)

igb 网卡还在显示

如何完全禁用 igb?

boot kernel linux-kernel

18
推荐指数
1
解决办法
3850
查看次数

在启动期间摆脱“未找到缓存模式页面”消息

在早期启动期间,我收到以下错误消息:

[sdb] No Caching mode page found
[sdb] Assuming drive cache: write through
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这实际上只是一条无害的信息消息,而不是实际错误。sdb是我的 U 盘,它不使用缓存。

问题是,我有意将内核日志级别设置为 4,以摆脱这些无用的信息消息。

为什么我仍然会收到此信息消息?

它困扰我的原因是,它干扰了我的密码提示(用于解密我的 LUKS 磁盘)

有没有办法摆脱这个消息?

startup logs kernel console

17
推荐指数
2
解决办法
12万
查看次数

bash_history:注释掉危险命令:`#`

为了防止在 bash 历史记录中记录“危险”命令,我在我的.bashrc文件中添加了以下行:

HISTIGNORE='rm *:mv *:cp *:cat*>*:pv*>*'
Run Code Online (Sandbox Code Playgroud)

这很有效,但它有一个副作用:我看不到在机器上执行的命令的完整历史记录。假设我有几台机器进行实验,我希望能够看到所有执行的命令。我会使用 bash internalhistory来显示已执行的命令,也许是今天的 grep :

history | grep Sep-28
Run Code Online (Sandbox Code Playgroud)

我想要做的是也记录“危险”命令,但#在行的开头放一个,这样如果我碰巧错误地执行了历史记录中的命令,就不会造成任何损害。

我不知道这是否可能。

更新和澄清:

这对我来说是个问题的主要原因是我通常从多个终端连接到我的机器,并且在一个终端上执行的任何命令都会立即读入其他终端的历史记录。这是通过

PROMPT_COMMAND="history -a; history -c; history -r"
Run Code Online (Sandbox Code Playgroud)

假设我打开了两个终端。在一个我有一些cat /dev/foo > file.out进程运行。第二,我用ls -lAhF. 我ls通过按UpENTER(即历史记录中的最后一个命令)不断重复。第一个命令完成后,历史记录中的最后一个命令不再是ls,而是cat /dev/foo > file.out。如果我不小心,我会再次启动cat并覆盖file.out。

我想实现的是 cat 命令前面带有 a #,这样它就不会被执行。但是,我仍然会在历史记录中看到它,并且可以通过取消注释来重用它(如果它是一个长命令)。

bash command-history

16
推荐指数
2
解决办法
1386
查看次数

终端:显示特殊字符

在某些程序中,如htop线条和框架显示不正确。相反,它们显示为-/

在此处输入图片说明

但在另一台机器上,它们正确显示为正确的行:

在此处输入图片说明

我不确定这是否是终端问题,或者是否需要某些软件包。

如果相关:我的系统是 Debian Wheezy,我的解释器是bash,我的终端模拟器是gnome-terminal

terminal character-encoding

16
推荐指数
2
解决办法
3万
查看次数