小编psm*_*ars的帖子

exec 和 tee 到日志文件:解释这些 bash 命令

我在 bash 脚本文件的顶部看到了这个:

export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
Run Code Online (Sandbox Code Playgroud)

它有什么作用?两个 exec 进程在这里做什么?我意识到保持这样,脚本执行的所有输出都通过管道传输,$LOGFILE但我想从exec语句的角度来理解。

bash

17
推荐指数
1
解决办法
6620
查看次数

为什么“rm -r”无法删除此文件夹?

我有一个文件夹-wx的权限称为folder1和里面的另一个文件夹名为folder2rwx权限。

我尝试folder1使用以下命令删除:

rm -r folder1
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误:

rm: cannot remove 'folder1': Permission denied
Run Code Online (Sandbox Code Playgroud)

我认为我收到此错误的原因是因为rm程序需要首先获取内容folder1(获取其中的文件和文件夹的名称folder1)才能删除该内容(因为您无法删除文件或我认为不知道其名称的文件夹),然后rm程序可以folder1自行删除。

但是既然folder1没有read权限,那么rm程序就不能得到它的内容,也就不能删除它的内容,既然不能删除它的内容,也就不能删除它。

我对么?

linux permissions rm

14
推荐指数
2
解决办法
8117
查看次数

在执行前验证命令二进制文件

是否有任何方法可以检查您从 bash 脚本实际执行的内容?

假设您的 bash 脚本正在调用多个命令(例如:tar, mail, scp, mysqldump),并且您愿意确保这tar是实际的、真实的tar,这可由root作为文件和父目录所有者的用户以及唯一具有写入权限的用户确定而不是一些/tmp/surprise/tar与所有者www-dataapache2成为所有者。

当然我知道PATH和环境,我很想知道这是否可以从正在运行的 bash 脚本中额外检查,如果可以,究​​竟是如何检查的?

示例:(伪代码)

tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
Run Code Online (Sandbox Code Playgroud)

shell security bash shell-script

13
推荐指数
2
解决办法
1721
查看次数

是否有一个文件始终存在而“普通”用户无法对其进行 lstat?

我需要这个进行单元测试。有一个函数对作为其参数传递的文件路径执行lstat。我必须触发lstat失败的代码路径(因为代码覆盖率必须达到 90%)

该测试只能在单个用户下运行,因此我想知道 Ubuntu 中是否有一个始终存在的文件,但普通用户对其或其文件夹没有读取权限。(所以lstat除非以 root 身份执行,否则会失败。)

不存在的文件不是解决方案,因为有一个单独的代码路径,我已经触发了。

编辑:仅缺乏对文件的读取权限是不够的。这样lstat仍然可以执行。我能够通过在 /root 中创建一个文件夹并在其中创建一个文件来触发它(在我具有 root 访问权限的本地计算机上)。并在文件夹上设置权限 700。因此,我正在搜索位于只能由 root 访问的文件夹中的文件。

linux ubuntu permissions

13
推荐指数
3
解决办法
3037
查看次数

是“$”吗?(美元问号)变量仅在 Bash shell 中可用?

Bashshell中,我可以通过$?变量获取命令退出状态:

# ps -ef | grep "haha"
root     15439 15345  0 23:02 pts/0    00:00:00 grep --color=auto haha
# echo $?
0
Run Code Online (Sandbox Code Playgroud)

它仅在 Bash shell 中可用吗?或者我也可以在其他 shell 中使用它?

shell bash portability

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

当给出一个实际上不需要 `sudo` 的命令时,sudo 如何决定是否要求输入密码?

当应用sudo到一个实际上不需要的命令时sudo

  • 有时它不会询问我的密码。例如在我的$HOME, sudo ls.

  • 但我记得它是针对其他一些命令的,尽管我忘记了是哪个命令。

所以我想知道sudo当给出一个实际上不需要的命令时如何决定是否要求输入密码sudo?有/etc/sudoers什么规定可以指定吗?

我真正的问题是,当我使用 时du,它有时会显示某些目录的“权限被拒绝”,有时则不会,可能是因为我对某些目录没有权限?我申请sudodu,并认为无论如何都会要求我输入密码,但实际上不在我自己的目录中。

password sudo

10
推荐指数
3
解决办法
7267
查看次数

将 UDP 单播数据包转换为广播?

我们需要从 Internet 唤醒我们内部 LAN 上的一些计算机。
我们有一个有点封闭的路由器,配置它的方法很少。
我想使用 netfilter (iptables) 来执行此操作,因为它不涉及守护进程或类似程序,但其他解决方案也可以。

我的想法是:

  • 外部计算机向公共 IP 地址发出 WOL(Wake-On-LAN)数据包(内部具有正确的 MAC)
  • 路由器上打开了正确的端口(比如 1234),将数据重定向到 Linux 机器
  • Linux box将UDP单播包转化为广播包(内容完全一样,只是目的地址修改为255.255.255.255或192.168.0.255)
  • 多播数据包到达每个网卡,并且所需的计算机现在处于唤醒状态

为此,一个非常简单的 netfilter 规则是:
iptables --table nat --append PREROUTING --in-interface eth+ --protocol udp --destination-port 1234 --jump DNAT --to-destination 192.168.0.255

唉 netfilter 似乎忽略了转换到广播。192.168.0.255 和 255.255.255.255 什么也没给。还用 192.168.0.0 和 0.0.0.0 进行了测试,
我使用 tcpdump 来查看会发生什么:
tcpdump -n dst port 1234
13:54:28.583556 IP www.xxx.yyy.zzz.43852 > 192.168.0.100.1234: UDP, length 102
仅此而已。我应该有第二行,如:
13:54:28.xxxxxx IP www.xxx.yyy.zzz.43852 > 192.168.0.255.1234: UDP, length 102

如果我重定向到非多播地址,则一切正常。我有 2 条预期的线路。但显然这不适用于 WOL。 …

iptables wake-on-lan broadcast

8
推荐指数
2
解决办法
1万
查看次数

为什么 Linux 文件系统层次结构中没有自述文件?

Linux 文件系统层次结构 ( FHS ) 包含许多重要目录。例如,我刚刚/sys/class/input在玩我的 PS/2 键盘设置时发现。

但是所有这些重要目录都记录在别处,因此man /sys/class/input无法解释在某个时刻发生的情况。

为什么不将README文件放入层次结构中,以便人们更轻松地了解特定级别上发生的事情并玩弄内容?如果设备甚至可以挂载自己的READMEs ,那就太棒了。

fhs documentation

8
推荐指数
2
解决办法
2438
查看次数

一个 while 循环和一个 here-document - 什么时候发生?

我有这个 while 循环和 here-document 组合,我在 Bash 4.3.48(1) 中运行,我根本不明白它的逻辑。

while read file; do source ~/unwe/"$file"
done <<-EOF
    x.sh
    y.sh
EOF
Run Code Online (Sandbox Code Playgroud)

我的问题由以下部分组成:

  1. read这里做什么(我总是read用来声明一个变量并以交互方式分配它的值,但我错过了它应该在这里做什么)。

  2. 是什么意思while readwhile进来的概念从哪里来?

  3. 如果 here-document 本身出现循环之后,它甚至如何受到循环的影响?我的意思是,它出现在 之后done,而不是在循环内部,那么这两个结构之间的实际关联是什么?

  4. 为什么这会失败?

    while read file; do source ~/unwe/"$file" done <<-EOF
        x.sh
        y.sh
    EOF
    
    Run Code Online (Sandbox Code Playgroud)

    我的意思是,donedone...那么为什么done <<-EOF与循环在同一行上很重要?如果我没记错的话,我确实遇到过这样一种情况,其中for循环是单行的并且仍然有效。

text-processing control-flow here-document variable read

8
推荐指数
1
解决办法
6644
查看次数

在没有 USR1 的情况下检查 dd 的进度吗?

我使用的是busybox 1.27纯 Linux 系统,因此没有output=progress可用的,没有 busybox 自己的实现,也没有pv它本身。pipe_progresspv

我有两个问题。第一个基于https://www.linux.com/training-tutorials/show-progress-when-using-dd/。它表示,通过向其发送USR1信号dd会“暂停”该过程,并且dd在打印后其当前状态将继续其正在执行的工作。我正在尝试进行一些基准测试,dd因此我希望对dd操作的影响最小。我希望每秒获得当前操作的输出,因为传递的数据dd是波动的,识别传输速率何时下降对我来说很重要。

第一个问题: “dd”每次收到USR1信号时都会“暂停”,这是真的吗?

如果dd每秒暂停一次,那么当传输数十千兆字节时,我将增加操作时间。

第二个问题: 假设第一个问题的答案是“是”,我想知道是否可以在dd不向进程发送任何信号的情况下打印其当前状态,也许是某种重定向STDOUT(如 2>&1)?

我指的是:

# bs with 1Mib so I can have more control on the test.
dd if=/dev/zero of=/dev/null bs=1048576 count=1024

# Printing current operation status.
sudo kill -USR1 $dd_pid 
Run Code Online (Sandbox Code Playgroud)

linux dd busybox

8
推荐指数
2
解决办法
2000
查看次数