我想查找没有特定权限集的所有目录。如下图所示,find
打印出不应列出的目录。
有人可以描述为什么吗?
为什么以下输出重定向会导致打印两行?
将>&2
stdout 复制到 stderr,>/dev/stderr
并将 stdout 重定向到 stderr。
我希望只有一个输出行,因为echo foo
输出被重定向到 stderr。
为什么我看不到两个输出行:echo foo >/dev/stderr 2>&1
和echo foo >/dev/stdout 2>&1
?
➜ app git:(python3.10-pipeline) ✗ echo foo >/dev/stderr >&2
foo
foo
➜ app git:(python3.10-pipeline) ✗ echo foo >/dev/stdout >&2
foo
foo
Bash 严格模式定义如下:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
http://redsymbol.net/articles/unofficial-bash-strict-mode/
考虑以下 Bash 脚本中位置参数的解析:
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
usage() {
echo ""
echo "usage:"
echo "$0 [options]"
echo " -r | --redirect-uri: redirect uri"
echo " -a | --app-role: app role id"
echo " -h | --help: help"
echo ""
}
redirect_uri=""
app_role=""
while [ "$1" != "" ]; do
case $1 in
-r | --redirect-uri)
shift
redirect_uri="$1"
;;
-a | --app-role)
shift
app_role="$1"
;;
-h | --help)
usage
exit 0
;;
*)
usage
exit 1
;;
esac
shift
done
...
这不适用于以下错误,例如:
$ ./app.sh -r https://example.net:8080/auth/callback -a 53b37b21-2c6e-4731-a5e5-15b98052c686
./app.sh: line 18: $1: unbound variable
我认为原因是条件的最终检查while
, after shift
, where$1
是未定义的。
使用 Bash 严格模式时,如何在while
不导致脚本崩溃的情况下终止语句中的参数解析?
使用以下命令从kernel.org手动编译和安装新内核通常是否安全:
make -j 8
make install
make modules_install
或者发行版(例如 Debian)可能会中断,因为它假定它通过 管理内核升级apt
?
直观地说,一切都应该继续工作,因为内核保留了稳定的系统调用 API,并且驱动程序与早期版本兼容。
在阅读了这篇关于通过更改为自定义解释器来执行任意程序的文章后PT_INTERP
,我尝试在本地进行实验:
$ cat flag.c
#include <stdio.h>
int main(int argc, char **argv) {
printf("Hello World!\n");
return 0;
}
$ gcc -static flag.c -o flag
$ cat solution.c
const char interp_section[] __attribute__((section(".interp"))) = "./flag";
$ gcc -s -fno-ident -Wl,--build-id=none -Wl,-e,0 -static -nostdlib solution.c -o solution
$ ./solution
Segmentation fault
$ ./flag
Hello World!
这个
PT_INTERP
程序头包含一个路径,也就是我们的ELF将在其下运行的解释器(可执行文件)的路径
既然solution
requests./flag
作为它的解释器,为什么不./flag
运行并打印消息“Hello World”,什么时候solution
执行?而是发生了分段错误,这与文章中的行为不同。
如何在 中成功注册和执行自定义解释器PT_INTERP
?
$ readelf -l solution
Elf file type is EXEC (Executable file)
Entry point 0x0
There are 4 program headers, starting at offset 64
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
PHDR 0x0000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000000e0 0x00000000000000e0 R 0x8
INTERP 0x0000000000000120 0x0000000000400120 0x0000000000400120
0x0000000000000007 0x0000000000000007 R 0x1
[Requesting program interpreter: ./flag]
LOAD 0x0000000000000000 0x0000000000400000 0x0000000000400000
0x0000000000000127 0x0000000000000127 R 0x1000
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 0x10
Section to Segment mapping:
Segment Sections...
00
01 .interp
02 .interp
03
ps
当标准输出是一个终端以适应终端的宽度时截断输出。
我从中看到了ps --help output
分别用于控制屏幕宽度和高度的ps
支持--width
和选项。--lines
我发现指定一个大的任意数字(如 )很尴尬--width 1000
,那么是否有一些值或选项可以设置“无限”屏幕宽度?
root@controlplane:~# apt list --installed procps
Listing... Done
procps/now 2:3.3.12-3ubuntu1.2 amd64 [installed,local]
额外:是否可以使用搜索模式-C <cmd>
来避免cmd
逐字输入?
例子
root@controlplane:~# ps -f -C kubelet
UID PID PPID C STIME TTY TIME CMD
root 9231 1 0 08:20 ? 00:00:07 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/
root@controlplane:~# ps -f -C kubelet | cat
UID PID PPID C STIME TTY TIME CMD
root 9231 1 0 08:20 ? 00:00:08 /usr/bin/kubelet --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --config=/var/lib/kubelet/config.yaml --network-plugin=cni --pod-infra-container-image=k8s.gcr.io/pause:3.2
如何查看设备的设备号/proc/1/ns/{ns}
?
我已经阅读了 Go 库的代码(见下文),其中指出可以确定容器是否在主机命名空间中:未命名空间的设备号/proc/1/ns/{ns}
是 4,其他任何东西都更高。
现在,在没有用户命名空间或 cgroup 的新 Debian 容器中,我运行以下命令:
root@54d74f795843:/# ls -la /proc/1/ns
total 0
dr-x--x--x 2 root root 0 Feb 29 17:18 .
dr-xr-xr-x 9 root root 0 Feb 29 17:18 ..
lrwxrwxrwx 1 root root 0 Feb 29 17:18 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 ipc -> 'ipc:[4026532290]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 mnt -> 'mnt:[4026532288]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 net -> 'net:[4026532293]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 pid -> 'pid:[4026532291]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Feb 29 17:18 uts -> 'uts:[4026532289]'
这里的 4026531837 是什么'user:[4026531837]'
意思?我不能是设备号,因为容器使用与主机相同的用户命名空间(我已经验证过)。
如何列出文件的设备号/proc/1/ns/{ns}
?该ls -la
命令显示这些文件是符号链接,那么它们怎么会有设备号呢?
amicontained/vendor/github.com/jessfraz/bpfd/proc/proc.go/
// HasNamespace determines if a container is using a particular namespace or the
// host namespace.
// The device number of an unnamespaced /proc/1/ns/{ns} is 4 and anything else is
// higher.
// Only works from inside a container.
func HasNamespace(ns string) (bool, error) {
file := fmt.Sprintf("/proc/1/ns/%s", ns)
// Use Lstat to not follow the symlink.
var info syscall.Stat_t
if err := syscall.Lstat(file, &info); err != nil {
return false, &os.PathError{Op: "lstat", Path: file, Err: err}
}
// Get the device number. If it is higher than 4 it is in a namespace.
if info.Dev > 4 {
return true, nil
}
return false, nil
}
Bash 中字符串的定义是什么?
Bash 在其文档中的多个地方使用了术语“字符串”,例如记录=~
用于正则表达式匹配的运算符:
额外的二元运算符 =~ 可用,其优先级与 == 和 != 相同。使用时,运算符右侧的字符串被视为 POSIX 扩展正则表达式并进行相应匹配(如在 regex(3) 中)。
在 sectionDEFINITIONS
中,我没有看到任何字符串定义:
DEFINITIONS
The following definitions are used throughout the rest of this document.
blank A space or tab.
word A sequence of characters considered as a single unit by the shell. Also known as a token.
name A word consisting only of alphanumeric characters and underscores, and beginning with an alphabetic character or an underscore. Also referred to as an identifier.
metacharacter
A character that, when unquoted, separates words. One of the following:
| & ; ( ) < > space tab newline
control operator
A token that performs a control function. It is one of the following symbols:
|| & && ; ;; ;& ;;& ( ) | |& <newline>
那么,Bash 中的字符串到底是什么?它们可以在IFS
环境变量中包含空格或字符吗?
注意:我知道字符串通常被定义为字母表中的一系列符号。
我想使用 安装“文件”包apt
,因为我的 Docker 容器缺少该file
命令。在安装之前,我正在检查包的详细信息(见下文)。
如何查看这些软件包的发布/更新日期?他们的描述说他们得到了 5 年的支持,但这没有任何意义,当我看不到它们何时发布/更新时?
另外,为什么要apt
列出两个“文件”包?当我运行时,将安装其中哪一个apt install file
?
root@eca1fcd5655a:/mnt/dotnetcore# apt show -a file
Package: file
Version: 1:5.32-2ubuntu0.3
Priority: important
Section: utils
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Christoph Biedl <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 81.9 kB
Depends: libc6 (>= 2.4), libmagic1 (= 1:5.32-2ubuntu0.3)
Homepage: http://www.darwinsys.com/file/
Task: minimal
Supported: 5y
Download-Size: 22.1 kB
APT-Sources: http://archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
Description: Recognize the type of data in a file using "magic" numbers
Package: file
Version: 1:5.32-2
Priority: important
Section: utils
Origin: Ubuntu
Maintainer: Ubuntu Developers <[email protected]>
Original-Maintainer: Christoph Biedl <[email protected]>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 81.9 kB
Depends: libc6 (>= 2.4), libmagic1 (= 1:5.32-2)
Homepage: http://www.darwinsys.com/file/
Task: minimal
Supported: 5y
Download-Size: 22.1 kB
APT-Sources: http://archive.ubuntu.com/ubuntu bionic/main amd64 Packages
Description: Recognize the type of data in a file using "magic" numbers
我发现在命令行的手册页中使用 grep 查找文本很有用,例如特定选项。
但是,grep
在手册页上操作时无法按预期工作,如下所示,其中模式"-f"
仅匹配"-"
而模式"--file"
不匹配(alias grep='grep --color=always'
):
nlykkei-mbp:~ nlykkei$ alias grep
alias grep='grep --color=always'
nlykkei-mbp:~ nlykkei$ man grep | grep -e "-f"
[-e pattern] [-f file] [--binary-files=value] [--color[=when]]
-F, --fixed-strings
-f file, --file=file
-h, --no-filename
--binary-file=without-match option.
-L, --files-without-match
-l, --files-with-matches
--binary-files=value
and the behaviour of the -f flag when used with an empty pattern file is
nlykkei-mbp:~ nlykkei$ man grep | grep -e "--file"
nlykkei-mbp:~ nlykkei$ echo "--file" | grep -e "--file"
--file
nlykkei-mbp:~ nlykkei$ ▒
相反,匹配管道文本echo
按预期工作,那么这与手册页的“不可见”格式有关吗?是否可以在手册页中可靠 grep 文本?
注意:我知道man -k
and man -K
,但这些并不能完全解决我想要实现的目标。
考虑 的共享对象依赖关系/bin/bash
,其中包括/lib64/ld-linux-x86-64.so.2
(动态链接器/加载器):
ldd /bin/bash
linux-vdso.so.1 (0x00007fffd0887000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f57a04e3000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f57a04de000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f57a031d000)
/lib64/ld-linux-x86-64.so.2 (0x00007f57a0652000)
检查/lib64/ld-linux-x86-64.so.2
表明它是一个符号链接/lib/x86_64-linux-gnu/ld-2.28.so
:
ls -la /lib64/ld-linux-x86-64.so.2
lrwxrwxrwx 1 root root 32 May 1 19:24 /lib64/ld-linux-x86-64.so.2 -> /lib/x86_64-linux-gnu/ld-2.28.so
此外,file
报告/lib/x86_64-linux-gnu/ld-2.28.so
自身是动态链接的:
file -L /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=f25dfd7b95be4ba386fd71080accae8c0732b711, stripped
我想知道:
/lib64/ld-linux-x86-64.so.2
) 本身如何动态链接?它是否在运行时链接自身?/lib/x86_64-linux-gnu/ld-2.28.so
记录处理 a.out 二进制文件(man ld.so
),但是/bin/bash
ELF 可执行文件吗?程序 ld.so 处理 a.out 二进制文件,这是一种很久以前使用的格式;ld-linux.so*(/lib/ld-linux.so.1 用于 libc5,/lib/ld-linux.so.2 用于 glibc2)处理 ELF,每个人都已经使用多年了。
为什么chroot
操作会报错:“ bash: /root/.bashrc: Permission denied
”?
我一直chroot
出于学习目的进行测试,并且在执行时遇到了以下错误/bin/bash
:
nlykkei@debian:~$ id
uid=1000(nlykkei) gid=1000(nlykkei) groups=1000(nlykkei),27(sudo)
nlykkei@debian:~$ sudo chroot --userspec nlykkei:root --groups sudo / /bin/bash
bash: /root/.bashrc: Permission denied
nlykkei@debian:/$ id
uid=1000(nlykkei) gid=0(root) groups=0(root),27(sudo)
似乎/bin/bash
是在尝试访问 root.bashrc
而不是nlykkei
's?
此外,我不能通过创建(复制)来NEWROOT
制作~
和执行:/bin/bash
~/bin/bash
nlykkei@debian:~$ ls -la ~/bin/bash
-rwxr-xr-x 1 nlykkei nlykkei 1168776 Sep 23 10:49 /home/nlykkei/bin/bash
nlykkei@debian:~$ sudo chroot --userspec nlykkei:root --groups sudo /home/nlykkei/ /bin/bash
chroot: failed to run command ‘/bin/bash’: No such file or directory
有什么办法可以解决这些问题?
nlykkei@debian:~$ uname -a
Linux debian 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64 GNU/Linux
我不确定,动态链接器/usr/bin/ld
是否由操作系统自动调用,在加载 ELF 文件时,还是由嵌入在 ELF 文件中的代码调用?
当我用于r2
调试 ELF 文件时,它会在要执行的第一条指令处停止,这应该是动态链接器代码,但我不知道这段代码是否是 ELF 文件的一部分。
作为符号链接创建的全球可写 systemd.service
文件是否会/etc/systemd/system
带来安全威胁?
是否有可能以某种方式修改指向.service
系统上任意文件的链接,并使 systemd 以 root 身份执行这些文件?
该/etc/systemd/system
目录的权限如下:
drwxr-xr-x. 11 root root 4096 Aug 30 12:57 /etc/systemd/system/
这个目录中的世界可写链接是:
1050594 0 lrwxrwxrwx 1 root root 9 Apr 9 11:53 /etc/systemd/system/ctrl-alt-del.target -> /dev/null
1050595 0 lrwxrwxrwx 1 root root 9 Apr 9 11:54 /etc/systemd/system/sensu-server.service -> /dev/null
1052003 0 lrwxrwxrwx 1 root root 9 Apr 9 11:54 /etc/systemd/system/sensu-api.service -> /dev/null
1052037 0 lrwxrwxrwx 1 root root 9 Apr 9 11:55 /etc/systemd/system/dataeng.service -> /dev/null