小编ger*_*ijk的帖子

如何实时监控进程打开的文件?

我知道我可以查看使用过程中打开文件lsof 的时间在那一刻,我的Linux机器上。但是,进程可以如此快速地打开、更改和关闭文件,以至于我在使用标准 shell 脚本(例如watch)监视它时将无法看到它,如“在 linux 上监视打开的进程文件(实时)”中所述.

所以,我想我正在寻找一种简单的方法来审核流程并查看它在过去的时间里做了什么。如果还可以查看它(尝试)建立的网络连接并在进程有时间运行而不启动审计之前开始审计,那就太好了。

理想情况下,我想这样做:

sh $ audit-lsof /path/to/executable
4530.848254 OPEN  read  /etc/myconfig
4530.848260 OPEN  write /var/log/mylog.log
4540.345986 OPEN  read  /home/gert/.ssh/id_rsa          <-- suspicious
4540.650345 OPEN  socket TCP ::1:34895 -> 1.2.3.4:80    |
[...]
4541.023485 CLOSE       /home/gert/.ssh/id_rsa          <-- would have missed
4541.023485 CLOSE socket TCP ::1:34895 -> 1.2.3.4:80    |   this when polling
Run Code Online (Sandbox Code Playgroud)

这是否可以使用strace某些标志来看不到每个系统调用?

process lsof open-files audit

50
推荐指数
1
解决办法
4万
查看次数

为什么在 Debian 上使用 `sha256sum` 验证 SHA256 校验和失败而在 Ubuntu 上工作?

在Ubuntu 14.04,sha256sumcoreutils作品如我所料:

echo 879dd0d7637876be4796f7e6f194a111d21088be85cfe717fc97e2e7f05e79d2 /tmp/myfile | sha256sum -c
/tmp/myfile: OK
Run Code Online (Sandbox Code Playgroud)

但是,在 Debian Wheezy 上使用完全相同的文件执行完全相同的命令失败:

sha256sum: standard input: no properly formatted SHA256 checksum lines found
Run Code Online (Sandbox Code Playgroud)

我不明白这个。如何在 Debian 的 shell 脚本中可靠地验证校验和?


在 Ubuntu 14.04 上:

? sha256sum --version
sha256sum (GNU coreutils) 8.21
Run Code Online (Sandbox Code Playgroud)

关于 Wheezy:

$ sha256sum --version
sha256sum (GNU coreutils) 8.13
Run Code Online (Sandbox Code Playgroud)

两个操作系统上的联机帮助页都说:

SYNOPSIS
       sha256sum [OPTION]... [FILE]...

DESCRIPTION
       Print or check SHA256 (256-bit) checksums.  With no FILE,
       or when FILE is -, read standard input.

[...]

       -c, --check
              read …
Run Code Online (Sandbox Code Playgroud)

debian checksum

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

当 / 上有可用空间时溢出 /tmp 挂载

我最近在/tmp. 我没有单独的/tmp分区,而且有 17% 的空闲空间/——那为什么我会得到一个溢出的tmp文件系统呢?

在此处输入图片说明

在此处输入图片说明

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/mapper/safesquid-root / …
Run Code Online (Sandbox Code Playgroud)

ubuntu tmp

28
推荐指数
3
解决办法
3万
查看次数

如何更改正在运行的进程的输出重定向?

我知道如何重定向输出以及如何在 bash 中抑制它们。现在,假设我不小心忘了输出重定向部分的命令(例如追加2>&1> /tmp/mystdout)和我的后台进程已经运行一段时间,我还可以更改为stdoutstderr正在写入?我真的不想杀死并重新启动应用程序。

更具体地说,正如吉尔斯在他的评论中所问的那样,我想在这些场景中具体地摆弄它:

  • 错误的输出文件
  • 忘记重定向stderrstdout

或两者的结合

例如,我有 Apache 运行,我可以看到文件描述符:

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log
Run Code Online (Sandbox Code Playgroud)

linux bash io-redirection

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

如何永久设置守护进程的 OOM 杀手调整?

使用单个或几个重要的系统服务守护进程运行一些 Linux 服务器,我想为这些守护进程调整 OOM 杀手,以防发生奇怪的事情。例如,今天一些运行 MySQL 的 Ubuntu 服务器杀死了一个 MySQL 守护进程,因为大量apt-checker进程正在消耗所有内存,内核认为杀死 MySQL 是个好主意。

我知道我可以使用该/proc/$(pidof mysqld)/oom_score_adj文件调整分数来为内核提供一些线索,我不希望 MySQL 被杀死,但这在服务重新启动后无法生存。我应该编辑包中的 init/upstart 脚本以包含这些调整吗?我认为这不是一个非常优雅的解决方案,因为我会对属于一个包的文件进行调整。是否可以在一般情况下连接到 upstart/init 脚本并有条件地调整它?或者你会建议运行一个不确定的脚本while true{ adjust_oom(); sleep 60;}吗?

linux-kernel daemon out-of-memory

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

在终端和 SSH 上禁用颜色

我的本地 Linux 机器有这样的彩色终端输出;

在此处输入图片说明

当我通过 SSH 连接到 pfSense/BSD 盒子时,它会像这样改变颜色;

在此处输入图片说明

即使当我从没有彩色本地终端输出的机器 SSH 和从那里 SSH 到这个 pfSense/FreeBSD 框时,它也会启用彩色输出,并开始产生不需要的彩色输出/

有什么我可以在本地更改的,以便当我从本地机器或通过中间机器通过 SSH 连接到 pfSense 框时,我的客户端将忽略远程颜色设置。理想情况下,我只想保持黑白,两种色调标准背景和文字颜色?

colors ssh terminal

12
推荐指数
3
解决办法
4万
查看次数

Linux 内核如何能够访问其分配的 initramfs/initrd?

我试图从您按下电源按钮的那一刻起了解整个机器的启动过程。从引导加载程序到 initramfs 阶段,我不太了解其他一些较小的部分。

鉴于条目的此 Grub 配置,取自最近的 Ubuntu 默认安装:

insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo    'Loading Linux x.y.z ...'
linux   /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset 
echo    'Loading initial ramdisk ...'
initrd  /initrd.img-x.y.z
Run Code Online (Sandbox Code Playgroud)

这在系统状态和内存方面实际上做了什么?我知道 Grub 的任务是“加载和运行内核”,它有自己的一组模块来访问设备(或网络)上的文件以获取它们。在这里insmod的例子中s, set rootand search- 但这只是从 Grub 的角度来看,并没有与内核共享,对吗?

我还猜测 Grub 正在将内核的(副本?)加载到内存(linuxcommand)中并启动它以开始执行。(显然是两个不同的步骤 - 那么,如何?)给定的参数可以在内核中读取并解释(这是一个映射到内存某处的大字符串吗?)并提供安排所请求事物的选项。

我也看到了这个initrd选项。这指向我的 gzip 压缩 initramfs,需要引导由root=. 但是这个initramfs是如何提供给内核的呢?它不会传递任何内存地址到它可以加载它的地方,也不能访问它本身,因为它在内核启动之前已经加载。一些内核文档说这个 initramfs 文件系统“设备”可以通过 访问/dev/ram0,但我不知道它是如何成为一个可访问的设备文件的。我猜我没看到水下发生了什么。

我也没有看到这与其他引导加载程序有什么关系,包括嵌入式平台,例如使用 U-boot/Coreboot。这是否与 Grub 做同样的事情(相同的标准内存地址?)以及在加载内核/initrd 方面这些与 Grub 相比在多大程度上? …

boot-loader initramfs linux-kernel

9
推荐指数
2
解决办法
3083
查看次数

如何为我的 AMD Radeon GPU 配置 Xen GPU 直通?

我有一个安装了 Xen 4.2.0(从源代码编译)和一个 AMD Radeon 7750 GPU 的 Ubuntu Server 12.10 设置。我的 Xen 安装似乎可以正常工作,例如我可以创建虚拟机。

我已经设置了一个虚拟机,当使用 VNC 连接到它时它似乎工作正常。但是,在更改配置以启用 GPU 直通后,我的显示器上没有显示任何内容,VNC 只显示“serial0”并且不允许我做任何事情。

为了启用 GPU 直通,我将以下内容附加到我的配置文件中:

gfx_passthru=1
pci=['01:00.0']
Run Code Online (Sandbox Code Playgroud)

如何正确地将我的 GPU 传递给我的虚拟机?

graphics xen

7
推荐指数
1
解决办法
2787
查看次数

如何访问我不管理的受限 NAT 网关后面的机器?

我有一台 Linux 机器,我希望能够通过 SSH、FTP、HTTP 等远程访问它。我使用 No-IP.com 注册了动态 DNS,但这还不够,因为我在大学校园网络中,在 NAT 后面,并且无权访问路由器以设置端口转发。我不知道校园路由器是否支持 UPnP 或 NAT-PMP,但我对此表示怀疑。

无论如何,我想知道是否有办法使用 VPN 来解决这个问题。我知道,例如,如果我在两台机器上都安装了 VPN 软件,那么 VPN 将允许我从我的笔记本电脑访问我的 linux 机器。但是我希望能够从任何计算机访问我的 linux box,而无需安装软件。或者至少能够以这种方式访问​​ HTTP 部分。虽然我知道许多 VPN 服务提供用于文件传输等的 Web 界面,但我更愿意使用常规 FTP 和 SSH 客户端软件访问我的 linux 机器。

无论如何,这是您可以用 VPN 做的事情吗?或者有没有办法以某种方式将 VPN 与动态 DNS 链接起来?我查看了 Hamachi VPN 的网站,但它用非技术术语描述了所有功能,所以我无法弄清楚这些问题,我更愿意在创建帐户之前了解。

networking ssh-tunneling vpn

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

如何为多个 Debian/Ubuntu 发行版构建和发布二进制文件?

对于专有软件,我想为多个发行版构建和发布多个版本的软件。例如 1.0、1.1 和用于挤压、喘息和精确的两个版本。

构建会在不同的机器上自动运行,并生成特定于发行版的.deb文件。特定于发行版的方式将它们链接到特定于发行版的库版本。例如,用于挤压的 OpenSSL 0.9.8,用于喘息的 1.0.1。但是,这些包是使用相同的版本号和包名构建的。这可能是导致以下问题的原因。

目前我正在使用 repreproincludedeb命令将二进制文件添加到存储库。这很好用,直到我添加了为第二个发行版构建的相同包版本。

为 Squeeze 发布很好

# reprepro -b ./repo --outdir ./wwwpub/repo includedeb squeeze /path/to/sqeezepackages/packagename-1.0.deb
Run Code Online (Sandbox Code Playgroud)

但是随后发布基于 wheezy 构建的相同版本的软件,为 wheezy 发布失败:

# reprepro -b ./repo --outdir ./wwwpub/repo includedeb wheezy /path/to/wheezypackages/packagename-1.0.deb 
/path/to/wheezypackages/packagename-1.0.deb: component guessed as 'main'
ERROR: '/path/to/wheezypackages/packagename-1.0.deb' cannot be included as 'pool/main/p/packagename/packagename_1.0_all.deb'.
Already existing files can only be included again, if they are the same, but:
md5 expected: e7df7cd2ca07f4f1ab415d457a6e1c13, got: 0fa924209085a5713f79e6a30649455f
sha1 expected: 947b41827bbac414baddf0648b9abecaad8de4fe, got: 1be168ff837f043bde17c0314341c84271047b31
sha256 expected: a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4, got: a93dbf1e95ddc4cfa84e9cd3cfa6c9e0e14affd79812abde4bca688224430a65 …
Run Code Online (Sandbox Code Playgroud)

packaging debian

6
推荐指数
1
解决办法
1969
查看次数

tmpfs 类型挂载中的(源)设备有什么意义吗?

我刚刚进入/etc/fstab(Linux)并将我的行/tmpext4以前安装了特定分区)更改为tmpfs. 这显然有点傻,但我没有想到。无论如何,我重新启动,一切正常,但我对以下内容感到困惑。

发布时mount我看到这个:

/dev/sda8 on /tmp type tmpfs
Run Code Online (Sandbox Code Playgroud)

这是否意味着/dev/sda8安装为tmpfs?如果 中存在任何文件/tmp,我将无法再访问它们,但我可以在其中创建文件。当我重新启动时,ext4我可以看到分区上实际上有文件(在tmpfs安装时不可见)进行安装。

在这种情况下,设备文件是否毫无意义?

linux mount fstab block-device tmpfs

5
推荐指数
1
解决办法
1320
查看次数

是否有对 shell/Bash 中 stderr 上打印的任何内容的简单测试?

我想在 shell 脚本中调用一个命令以进行持续集成。退出状态 0 表示成功,否则失败。我正在编写一个包装脚本来运行多个命令,如果其中一个发生任何错误,则失败。

但是,其中一个命令(第 3 方软件)在失败时不符合“事实上的”退出状态 != 1。但是,如果出现故障,它会在 stderr 上打印其错误。

当前的包装器脚本,如果两者都可以正常工作,mycommand并且other-command由于-e切换而失败并退出状态 != 0 :

#!/bin/bash -ex
mycommand --some-argument /some/path/to/file
other-command --other-argument /some/other/file
Run Code Online (Sandbox Code Playgroud)

如何检查打印到 stderr 的任何内容(使主脚本失败)?这是我尝试过的:

  1. stderr 输出重定向到文件,检查文件内容。
    希望避免创建临时文件。
  2. 将 stderr 重定向到 subshel​​l stdin,例如:

    mycommand 2> >(if grep .; then echo NOK; else echo OK; fi)
    
    Run Code Online (Sandbox Code Playgroud)

    这似乎工作正常,但是,我无法控制此处的主 shell 退出,即exit 1不会退出主程序。我也不能控制子外壳之外的变量来传播它的结果。我真的必须创建一个命名管道吗?

  3. 这个答案一样设置额外的文件描述符。
    对我来说看起来不是很优雅,真的。

一些“要求”:

  • 它不应该在 stdout 上的常规输出上失败(也在那里输出)。
  • 我想在标准输出上保留其他有用的输出。
  • 我想保留当前在 stderr 上的任何输出打印(可能是 stdout,但不应该被隐藏)。

所以它应该表现得像一个包装器,只以不干净的状态退出,保留打印输出。

我只是希望有更优雅的东西来检查 stderr 中的任何内容。抨击是可以接受的。

bash file-descriptors exit subshell stderr

5
推荐指数
1
解决办法
4621
查看次数

如何对 HTTP 代理使用身份验证和协商(例如 Kerberos)?

一般接受的是使用HTTP_PROXY/HTTPS_PROXY环境变量来指定代理服务器的使用。身份验证可以包含在该 URL 中,例如HTTP_PROXY=http://user:pass@myproxy.mydomain.tld:3128/

但是,我使用 Kerberos SSO 通过代理进行身份验证。我该如何配置呢?因此,假设 Squid 代理服务器配置如下所述: https: //wiki.squid-cache.org/ConfigExamples/Authenticate/Kerberos。它描述了 Windows 客户端如何通过协商使用代理身份验证,但没有信息如何配置 Linux/Unix 客户端。

对于 cURL,使用--proxy-negotiate -u :可以解决问题,例如:

HTTPS_PROXY=http://myproxy.mydomain.tld:3128/ curl --proxy-negotiate -u : https://www.google.com
Run Code Online (Sandbox Code Playgroud)

如何告诉非 cURL 应用程序使用此机制?例如 Debian/Ubuntu APT 带有Acquire::http::Proxy "http://myproxy.mydomain.tld:3128/";?

我发现cntlm充当中间另一个本地运行的代理,促进来自本地主机的未经身份验证的连接。但是,这仅适用于 NTLM,而我需要 Kerberos。Squid 是否能够使用 Kerberos 作为客户端进行连接?众所周知,在代理服务器的传出连接上找到身份验证功能似乎非常困难。所有这些似乎都集中在侦听套接字上的身份验证功能上。

http-proxy proxy http squid kerberos

5
推荐指数
0
解决办法
1万
查看次数