do
Bashfor
循环语法中关键字的用途是什么?对我来说,感觉是多余的。
for i in `seq 1 2`; do echo "hi"; done
Run Code Online (Sandbox Code Playgroud)
为什么不是这样的语法?
for i in `seq 1 2`; echo "hi"; done
Run Code Online (Sandbox Code Playgroud)
我确信它确实达到了目的。我只是想学习。
我正在尝试用 dd 做一些技巧。我认为可以将一些十六进制值存储在名为“header”的变量中以将其通过管道传输到 dd。
我没有变量的第一步是这样的:
$ echo -ne "\x36\xc9\xda\x00\xb4" |dd of=hex
$ hd hex
00000000 36 c9 da 00 b4 |6....|
00000005
Run Code Online (Sandbox Code Playgroud)
之后我尝试了这个:
$ header=$(echo -ne "\x36\xc9\xda\x00\xb4")
$ echo -n $header | hd
00000000 36 c9 da b4 |6...|
00000004
Run Code Online (Sandbox Code Playgroud)
如您所见,我\x00
在$header
变量中丢失了值。有没有人对这种行为有解释?这真让我抓狂。
我读到会话的 ID 与通过setsid()
系统调用创建会话的进程的 pid 相同,但我没有找到有关如何设置进程组 ID 的任何信息。进程组 ID 是否与创建进程组的进程的 pid 相同?
我们可以通过使用该ps
命令来确定进程的所有者。这是否意味着其他用户无法运行/杀死/恢复该进程?
我在 AU 上发布了一个问题的答案,我发现参数扩展 on$@
不适用于sh
shell:
<infile xargs -d'\n' sh -c 'echo "${@%%/*}"' _
Run Code Online (Sandbox Code Playgroud)
但它在bash
. 这是sh
shell 的预期行为,我如何在那里执行扩展?
此外,我知道通过-n1
选项xargs
我一次只能将一行传递给命令,但我对是否sh
可以扩展感兴趣$@
:
<infile xargs -d'\n' -n1 sh -c 'echo "${0%%/*}"'
Run Code Online (Sandbox Code Playgroud)
infile
包含:
A1 /B1/C1
A 2/B2/C2
A3/B3/C3
Run Code Online (Sandbox Code Playgroud) 我有一个secret.asc
包含 ASCII 装甲(即纯文本并以 开头-----BEGIN PGP PRIVATE KEY BLOCK-----
)PGP/GPG 秘密/私钥的文件,我想知道它的 40 个字符的密钥指纹,而无需将其导入我的 GPG 密钥环。不幸的是,我尝试过的任何命令都没有向我提供该信息。
以下失败的尝试是在 Ubuntu Xenial 16.04.5 上运行的,gpg 版本为 1.4.20,gpg2 版本为 2.1.11。有问题的密钥仅出于实验目的而创建,不会用于任何用途,因此我不在乎输出是否透露太多信息。
$ gpg --with-fingerprint secret.asc
sec 2048R/161722B3 2018-09-12
uid Testing <testing@testing.nil>
Run Code Online (Sandbox Code Playgroud)
只有短密钥ID,没有指纹。
$ gpg2 --with-fingerprint secret.asc
gpg: DBG: FIXME: merging secret key blocks is not anymore available
gpg: DBG: FIXME: No way to print secret key packets here
Run Code Online (Sandbox Code Playgroud)
错误。
$ gpg --with-fingerprint --no-default-keyring --secret-keyring ./secret.asc --list-secret-keys
gpg: [don't know]: invalid packet (ctb=2d)
gpg: keydb_search_first …
Run Code Online (Sandbox Code Playgroud) 我有一段可以工作的代码,如下所示(请注意,这是用于 AWS 自动部署的 CloudFormation 模板):
EFS_SERVER_IPS_ARRAY=( $(aws efs describe-mount-targets --file-system-id ${SharedFileSystem} | jq '.MountTargets[].IpAddress' -r) )
echo "IPs in EFS_SERVER_IPS_ARRAY:"
for element in "${EFS_SERVER_IPS_ARRAY[@]}"
do
echo "$element"
echo "$element $MOUNT_SOURCE" >> /etc/hosts
done
Run Code Online (Sandbox Code Playgroud)
这有效,但看起来很难看。我想避免数组变量和for
循环(基本上我不关心第一个 echo 命令)。
我可以以某种方式使用输出($element,它是 1 个或更多,目前是 2 行 IP)并将其汇集到两个执行中,例如:
long AWS command >> echo $element $MOUNT_SOURCE >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)
在当前的实现中,echo 执行的次数与数组中的变量一样多?我将如何重写这个?
AWS 命令的输出是这样的:
10.10.10.10
10.22.22.22
Run Code Online (Sandbox Code Playgroud)
然后,添加的行/etc/hosts
如下所示:
10.10.10.10 unique-id.efs.us-east-1.amazonaws.com
10.22.22.22 unique-id.efs.us-east-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud) I am practicing with parameter substitution in bash.
I wrote the following dummy script:
#!/bin/bash
var1="/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext"
var2="/some/path/to/file/the_file.arbitrary.n.ext.0.ext"
pattern='.[0-9]?(.random).ext'
echo "${pattern}"
echo "${var1/${pattern}/}"
echo "${var2/${pattern}/}"
Run Code Online (Sandbox Code Playgroud)
Basically, the pattern is meant to strip off the last part of the file name.
Executing the dummy script results in:
~$ ./dummy.sh
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext.0.random.ext
/some/path/to/file/the_file.arbitrary.n.ext.0.ext
Run Code Online (Sandbox Code Playgroud)
whereas eval
ing the script's contents or, equivalently, the direct input of that sequence of commands in the interactive shell, results in:
~$ eval "$(cat dummy.sh)"
.[0-9]?(.random).ext
/some/path/to/file/the_file.arbitrary.n.ext
/some/path/to/file/the_file.arbitrary.n.ext
Run Code Online (Sandbox Code Playgroud)
The …
要安装 Sublime,它需要我添加一个 GPG 密钥和一个 sources.list 条目,以便 apt-get 可以找到它。其他几个程序也提出了同样的要求。为什么向sources.list 添加更多域不会带来安全风险?
即:假设包 A 应该来自主机 B。我将主机 C 添加到新的 sources.list 中。主机 C 被破坏,攻击者托管一个恶意包并将其称为 A。下次我尝试更新 A 时,apt-get 检查源并决定从 C 而不是 B 下载它,我得到了恶意版本。
在 Xubuntu 16.04 上,我想安装最新的 Virtualbox 包。我知道我可以通过 APT 安装它并通过 Ubuntu 存储库接收更新,或者我可以添加一个 PPA(如果有的话)并从那里接收它。
在此链接中,我可以下载软件包或将其添加到sources.list
并安装:https : //www.virtualbox.org/wiki/Linux_Downloads
但我宁愿通过从他们的网站下载来安装最新的软件包。如果我运行“ dpkg -i install packagename
”,它会安装软件包,但是它会添加一个新的存储库,每当我运行“ sudo apt-get update && sudo apt-get upgrade
”时我都会从中接收更新?我可以以某种方式检查包是否包含这样的存储库吗?
我正在制作一个具有 setuid 权限的 Bash 脚本,但它不起作用。所以我在这里找到了我的解决方案:
现在我的脚本一切正常(我用 cpp 重写了它)。
为了满足我对为什么纯 Bash shell 不起作用的好奇心,我阅读了这个链接:http : //www.faqs.org/faqs/unix-faq/faq/part4/section-7.html(参考这个答案:https : //unix.stackexchange.com/a/2910)。在那个网站上,我遇到了以下内容:
$ echo \#\!\/bin\/sh > /etc/setuid_script
$ chmod 4755 /etc/setuid_script
$ cd /tmp
$ ln /etc/setuid_script -i
$ PATH=.
$ -i
Run Code Online (Sandbox Code Playgroud)
我不明白第四行,它是ln /etc/setuid_script -i
.
这个命令有什么作用?
我在ln
手册中读到的-i
只是“交互式”标志(询问您是否要覆盖现有文件)。那么为什么ln /etc/setuid_script -i
遵循PATH=.
并-i
让我的 shell 执行/bin/sh -i
呢?