gcc-6
我正在尝试在 Raspbian stretch 上构建源包;因此我这样做:
apt source gcc-6
cd gcc-6-6.3.0/debian
debuild -b -uc -us
该debuild
命令启动完整构建。由于构建在我的平台上崩溃,我想运行一个命令,它将解压源代码并应用 Debian 补丁,然后在配置之前停止(这样我就可以应用自己的补丁) - 然后我可以继续debuild -b -uc -us -nc
。
是否有命令可以帮助我做到这一点?
gcc-6
我正在尝试在 Raspbian stretch 上构建源包;因此我这样做:
apt source gcc-6
cd gcc-6-6.3.0/debian
debuild -b -uc -us
该debuild
命令启动完整构建。由于构建在我的平台上崩溃,我想运行一个命令,它将解压源代码并应用 Debian 补丁,然后在配置之前停止(这样我就可以应用自己的补丁) - 然后我可以继续debuild -b -uc -us -nc
。
是否有命令可以帮助我做到这一点?
我想在 中调试我的应用程序gdb
,但是可能需要一些系统库的完整源代码。例如,在 中的调试过程中的某个时刻gdb
,我遇到了以下情况:
...
(gdb) si
0x00047e28 in std::thread::detach() ()
(gdb) c
Continuing.
...
Thread 1 "myProject" received signal SIGABRT, Aborted.
raise (sig=<optimized out>) at ../sysdeps/unix/sysv/linux/raise.c:51
51 ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
我不确定为什么std::thread::detach()
我没有得到源文件建议(我在线手动查找并发现它在libstdc++-v3/src/c++11/thread.cc中),但raise()
我确实得到了源文件和行../sysdeps/unix/sysv/linux/raise.c:51
。
无论如何,对于其中任何一个,thread.cc
或者raise.c
,我如何找到给定 Debian 上的哪个源apt source [package]
包包含它们?因此,我最终可以获取它们并提供这些文件的路径,如https://stackoverflow.com/questions/48278881/gdb-complaining-about-missing-raise-c/48287761#48287761gdb
中所述,这样我就可以逐步浏览源代码行(特别是查看底层函数从我的代码中接收什么作为参数)...
我已经尝试过apt-file
,但是它似乎不适用于源包:
$ apt-file search raise.c
gnulib: /usr/share/gnulib/lib/raise.c
gnulib: /usr/share/gnulib/tests/test-raise.c
很酷,但是这些看起来都不像../sysdeps/unix/sysv/linux/raise.c
?!
$ apt-file search thread.cc
c++-annotations: /usr/share/doc/c++-annotations/examples/yo/threading/examples/functorthread.cc
libglibmm-2.4-doc: /usr/share/doc/libglibmm-2.4-doc/examples/thread/thread.cc
omniorb-doc: /usr/share/doc/omniorb-doc/examples/poa/threading/mainthread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/asan/asan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/lsan/lsan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/msan/msan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/tsan/rtl/tsan_rtl_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/lib/tsan/tests/rtl/tsan_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/test/tsan/race_with_finished_thread.cc
rust-src: /usr/src/rustc-1.24.1/src/libcompiler_builtins/compiler-rt/test/tsan/signal_thread.cc
好的,apt-file
再次发现了一些东西,但它们似乎都是误报,没有任何内容符合预期libstdc++-v3/src/c++11/thread.cc
。
那么,有没有办法在 Debian 上查找这样的源文件?具体来说,我在 Raspberry Pi 3B+ 上使用 Raspbian Stretch。
请考虑以下示例:
mkdir /tmp/test2 && cd /tmp/test2
mkdir -p aa/{tmp,src}
mkdir -p bb/aa/{tmp,src}
mkdir -p {dd,ee}/bb
touch {dd,ee}/bb/aa
tree | awk '{print "# " $0}'
# .
# ├── aa
# │ ├── src
# │ └── tmp
# ├── bb
# │ └── aa
# │ ├── src
# │ └── tmp
# ├── cc
# │ └── aa
# │ ├── src
# │ └── tmp
# ├── dd
# │ └── bb
# │ └── aa
# └── ee
# └── bb
# └── aa
#
# 16 directories, 2 files
因此,我想找到所有名为的项目aa
,并以与相同的格式将它们打印出来ls -la
,这样我就可以知道它们是文件还是目录。
如果我使用典型的find
-exec
那么ls -a
目录本身就不会打印为项目,而是其内容如下:
$ find . -name aa -exec ls -la {} \;
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 12:00 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 11:59 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
total 0
drwxr-xr-x 1 user None 0 Feb 19 11:59 .
drwxr-xr-x 1 user None 0 Feb 19 11:59 ..
drwxr-xr-x 1 user None 0 Feb 19 11:59 src
drwxr-xr-x 1 user None 0 Feb 19 11:59 tmp
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./dd/bb/aa
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./ee/bb/aa
如果我改用,ls -lad {}/
那么我明确地只打印出目录节点,那么文件节点根本就不会打印,而是收到错误“不是目录”:
$ find . -name aa -exec ls -lad {}/ \;
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./bb/aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./cc/aa/
ls: cannot access './dd/bb/aa/': Not a directory
ls: cannot access './ee/bb/aa/': Not a directory
bash
如果我直接在命令行上尝试某种条件,它会失败:
# test
$ [ -d aa ] && echo dir || echo file
dir
$ find . -name aa -exec [ -d {} ] && ls -lad {}/ || ls -la {} \;
find: missing argument to `-exec'
ls: cannot access '{}': No such file or directory
ls: cannot access ';': No such file or directory
那么,我该如何使用find . -name aa
,最终我得到这个输出:
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./bb/aa/
drwxr-xr-x 1 user None 0 Feb 19 11:59 ./cc/aa/
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./dd/bb/aa
-rw-r--r-- 1 user None 0 Feb 19 12:00 ./ee/bb/aa
在我的 Ubuntu 服务器上,我发现它非常有用,netstat -tulpn
它还显示了所连接的用户名sshd
(显然,这个用户名打印是专门为sshd
) - 不幸的是,这个打印输出也被截断了:
$ sudo netstat -tulpn | grep 'PID\|user1'
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:12345 0.0.0.0:* LISTEN 1620557/sshd: user1
tcp6 0 0 :::12345 :::* LISTEN 1620557/sshd: user1
在上面的例子中,完整的用户名是user1234
,但由于截断,我只能读取user1
。
更不幸的是,我发现这个截断在Netstat 输出行宽限制netcat
中是硬编码的:
不幸的是,netstat 中 PID/程序名称列的宽度是硬编码的
#define PROGNAME_WIDTH 20
,因此无法直接从 netstat 获取完整输出。此外,您最终会得到 19 个字符和一个空格。
同样的答案也建议:
在今天的 Linux 中,人们可以使用
sudo ss -natp
稍微不同的格式来获取完整信息,但使用全名:
...不幸的是,ss
没有打印所连接用户的用户sshd
名netstat
:
$ sudo ss -tulpn | grep user1
$
$ sudo ss -tulpn | grep 12345
tcp LISTEN 0 128 0.0.0.0:12345 0.0.0.0:* users:(("sshd",pid=1620557,fd=10))
tcp LISTEN 0 128 [::]:12345 [::]:* users:(("sshd",pid=1620557,fd=11))
那么,如何才能获得与 的输出相同或相似的输出netstat -tulpn
,但打印出与 连接的完整用户名sshd
?
我的 netstat 版本是:
$ netstat --version
net-tools 2.10-alpha
Fred Baumgarten, Alan Cox, Bernd Eckenfels, Phil Blundell, Tuan Hoang, Brian Micek and others
+NEW_ADDRT +RTF_IRTT +RTF_REJECT +FW_MASQUERADE +I18N +SELINUX
AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE -BLUETOOTH
HW: +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64
我有一个名为pub
Ubuntu 20.04 服务器的目录,我希望防止被删除,我发现https://askubuntu.com/questions/504151/how-to-prevent-directory-from-being-deleted-by-用户所以我尝试了:
$ sudo chattr +i pub
很好,现在我想检查该属性是否已设置:
$ lsattr pub
--------------e----- pub/__pycache__
--------------e----- pub/file1.py
--------------e----- pub/file2.py
--------------e----- pub/file3.py
--------------e----- pub/file4.py
所以,我得到了列出的目录的内容,但我没有得到列出的目录,这正是我想要的。
我的意思是,如果它至少给了我一个条目pub
,我会没事的——但是在这里我得到了所有的孩子,而不是我要求的……这太愚蠢了。
事实证明,有一个lsattr -R
“递归”开关,我希望它提供像上面一样的输出 - 但是当我运行它时,它也只是下降到__pycache__
目录中。
那么,你如何lsattr
只创建一个目录,这样你就可以看到你是否实现了正确的事情chattr
?
我刚刚意识到它history
不会在子外壳中输出任何内容。我将尝试通过计算行数来显示 - 首先使用 echo 进行完整性检查:
$ echo a | wc -l
1
...在一个子shell中:
bash -c 'echo a' | wc -l
1
实际上,我们期望在这两种情况下都有一条线路输出。现在,对于history
:
$ history | wc -l
681
...但在一个子外壳中:
$ bash -c 'history' | wc -l
0
...history
不返回任何行。
为什么会发生这种情况 - 我怎样才能history
在子 shell 中输出当前 shell 的历史记录(包括上次会话命令)?
我正在尝试破解 MSYS 包,所以我找到了https://www.msys2.org/wiki/Creating-Packages/ - 例如:
git clone "https://github.com/msys2/MSYS2-packages"
cd MSYS2-packages/flex
makepkg -sCLf
所以,如果我运行它,我会构建源代码,并得到一个包。
现在,假设我更改了 flex 包的源代码中的某些内容,并且我想重新构建。
我尝试了makepkg -sCLf
,但该命令实际上删除了源目录 - 包括我的 hacks - 因此,特别是该命令不能用于构建包含 hacks/更改的源文件的包。
我可以使用什么命令来构建(希望只是)源中更改的文件,并从该源构建一个包?
我对到底是debi
做什么有点困惑。
我正在构建 OLA,我发现了这篇文章:使用最新的 OLA 0.9.7 为 BBB 构建 .debs 时出错... –我见过的 Google 群组:
cd ola-0.9.7
debuild
# (... wait ...)
sudo debi
所以,我确实用 .debs 构建debuild
,结果得到了这些 .debs:
$ ls -1 ../*.deb
../libola1_0.10.7-1_armhf.deb
../libola1-dbgsym_0.10.7-1_armhf.deb
../libola-dev_0.10.7-1_armhf.deb
../ola_0.10.7-1_armhf.deb
../ola-dbgsym_0.10.7-1_armhf.deb
../ola-python_0.10.7-1_all.deb
../ola-rdm-tests_0.10.7-1_all.deb
问题是,当我第一次通过二进制包 (Raspbian) 安装 OLA 时,在此构建之前,我最终安装了包ola libola1 ola-rdm-tests ola-python
(我在构建之前已将其卸载)。
所以,我不确定,如果我只是运行debi
,我会只安装那些包,还是会安装所有生成的 .debs(包括-dbgsym
和-dev
包,在这种特殊情况下,我不需要)?
换句话说,如果我只想安装其中一些 .deb 包,我最好只做sudo dpkg -i [package1] [package2] ...
,而不是使用sudo debi
?