我在 bash 脚本文件的顶部看到了这个:
export LOGFILE=$LOGDIRECTORY/${SCRIPT_NAME}.log
exec > >(tee $LOGFILE)
exec 2>&1
Run Code Online (Sandbox Code Playgroud)
它有什么作用?两个 exec 进程在这里做什么?我意识到保持这样,脚本执行的所有输出都通过管道传输,$LOGFILE
但我想从exec
语句的角度来理解。
我有一个文件夹-wx
的权限称为folder1
和里面的另一个文件夹名为folder2
与rwx
权限。
我尝试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
程序就不能得到它的内容,也就不能删除它的内容,既然不能删除它的内容,也就不能删除它。
我对么?
是否有任何方法可以检查您从 bash 脚本实际执行的内容?
假设您的 bash 脚本正在调用多个命令(例如:tar
, mail
, scp
, mysqldump
),并且您愿意确保这tar
是实际的、真实的tar
,这可由root
作为文件和父目录所有者的用户以及唯一具有写入权限的用户确定而不是一些/tmp/surprise/tar
与所有者www-data
或apache2
成为所有者。
当然我知道PATH
和环境,我很想知道这是否可以从正在运行的 bash 脚本中额外检查,如果可以,究竟是如何检查的?
示例:(伪代码)
tarfile=$(which tar)
isroot=$(ls -l "$tarfile") | grep "root root"
#and so on...
Run Code Online (Sandbox Code Playgroud) 我需要这个进行单元测试。有一个函数对作为其参数传递的文件路径执行lstat。我必须触发lstat
失败的代码路径(因为代码覆盖率必须达到 90%)
该测试只能在单个用户下运行,因此我想知道 Ubuntu 中是否有一个始终存在的文件,但普通用户对其或其文件夹没有读取权限。(所以lstat
除非以 root 身份执行,否则会失败。)
不存在的文件不是解决方案,因为有一个单独的代码路径,我已经触发了。
编辑:仅缺乏对文件的读取权限是不够的。这样lstat
仍然可以执行。我能够通过在 /root 中创建一个文件夹并在其中创建一个文件来触发它(在我具有 root 访问权限的本地计算机上)。并在文件夹上设置权限 700。因此,我正在搜索位于只能由 root 访问的文件夹中的文件。
在Bash
shell中,我可以通过$?
变量获取命令退出状态:
# 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 中使用它?
当应用sudo
到一个实际上不需要的命令时sudo
,
有时它不会询问我的密码。例如在我的$HOME
, sudo ls
.
但我记得它是针对其他一些命令的,尽管我忘记了是哪个命令。
所以我想知道sudo
当给出一个实际上不需要的命令时如何决定是否要求输入密码sudo
?有/etc/sudoers
什么规定可以指定吗?
我真正的问题是,当我使用 时du
,它有时会显示某些目录的“权限被拒绝”,有时则不会,可能是因为我对某些目录没有权限?我申请sudo
了du
,并认为无论如何都会要求我输入密码,但实际上不在我自己的目录中。
我们需要从 Internet 唤醒我们内部 LAN 上的一些计算机。
我们有一个有点封闭的路由器,配置它的方法很少。
我想使用 netfilter (iptables) 来执行此操作,因为它不涉及守护进程或类似程序,但其他解决方案也可以。
我的想法是:
为此,一个非常简单的 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。 …
Linux 文件系统层次结构 ( FHS ) 包含许多重要目录。例如,我刚刚/sys/class/input
在玩我的 PS/2 键盘设置时发现。
但是所有这些重要目录都记录在别处,因此man /sys/class/input
无法解释在某个时刻发生的情况。
为什么不将README
文件放入层次结构中,以便人们更轻松地了解特定级别上发生的事情并玩弄内容?如果设备甚至可以挂载自己的README
s ,那就太棒了。
我有这个 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)
我的问题由以下部分组成:
read
这里做什么(我总是read
用来声明一个变量并以交互方式分配它的值,但我错过了它应该在这里做什么)。
是什么意思while read
?while
进来的概念从哪里来?
如果 here-document 本身出现在循环之后,它甚至如何受到循环的影响?我的意思是,它出现在 之后done
,而不是在循环内部,那么这两个结构之间的实际关联是什么?
为什么这会失败?
while read file; do source ~/unwe/"$file" done <<-EOF
x.sh
y.sh
EOF
Run Code Online (Sandbox Code Playgroud)
我的意思是,done
是done
...那么为什么done <<-EOF
与循环在同一行上很重要?如果我没记错的话,我确实遇到过这样一种情况,其中for
循环是单行的并且仍然有效。
我使用的是busybox 1.27
纯 Linux 系统,因此没有output=progress
可用的,没有 busybox 自己的实现,也没有pv
它本身。pipe_progress
pv
我有两个问题。第一个基于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) bash ×3
linux ×3
permissions ×2
shell ×2
broadcast ×1
busybox ×1
control-flow ×1
dd ×1
fhs ×1
iptables ×1
password ×1
portability ×1
read ×1
rm ×1
security ×1
shell-script ×1
sudo ×1
ubuntu ×1
variable ×1
wake-on-lan ×1