小编Mat*_*teo的帖子

lsof 和监听端口

我正在尝试让所有进程在 Mac OS X 上侦听网络连接。netstat没有-p选项,我正在尝试使用 lsof

lsof -i -sTCP:LISTEN
Run Code Online (Sandbox Code Playgroud)

给了我一个公平的聆听过程清单,但不是全部。例如,我可以 telnet 到端口 10080,在那里我有一个进程正在侦听连接,但这未显示在lsof. 我错过了什么?

$ telnet localhost 10080
Trying ::1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> Connection closed.
Run Code Online (Sandbox Code Playgroud)

$ sudo lsof -n -i | grep 10080
$
Run Code Online (Sandbox Code Playgroud)

osx lsof

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

shellcheck 建议不要使用 basename:为什么?

我正在尝试shellcheck

我有类似的东西

basename "${OPENSSL}" 
Run Code Online (Sandbox Code Playgroud)

我得到以下建议

Use parameter expansion instead, such as ${var##*/}.
Run Code Online (Sandbox Code Playgroud)

从实际的角度来看,我认为没有区别

$ export OPENSSL=/opt/local/bin/openssl
$ basename ${OPENSSL}
openssl
$ echo ${OPENSSL##*/}
openssl
Run Code Online (Sandbox Code Playgroud)

由于basenamePOSIX 规范中,我不知道为什么它应该是最佳实践。任何提示?

shell filenames posix basename

28
推荐指数
2
解决办法
2088
查看次数

`ls -s` 什么时候打印“0”

当然,测试文件是否为空的标准方法是使用test -s FILE,但我们的一个客户收到了一个包含如下测试的脚本:

RETVAL=`ls -s ./log/cr_trig.log | awk '{print $1}'`
if test $RETVAL -ne 0
then
    echo "Badness: Log not empty"
    exit 25
fi
Run Code Online (Sandbox Code Playgroud)

供应商声称它可以在他们测试过的两种环境中工作。不用说,它在我测试的两个地方都失败了。

所以,我很好奇。什么时候ls -s打印0空文件?

这是我到目前为止的发现:

  • Linux 上的 GFS:4
  • Linux 上的 ext4:0
  • Solaris 上的 ZFS:1
  • Solaris 上的 UFS:0
  • AIX 上的 jfs:0
  • HP-UX 上的 VxFS:0
  • HP-UX 上的 HFS:0
  • Mac OS X 上的 HFS:0

我还没有检查过网络文件系统。

问题:我如何优雅地向其他人解释他们的脚本是错误的

在我看来,“正确”的版本是:

if test ! -s ./log/cr_trig.log
then
    echo "Badness: Log not empty"
    exit 25
fi
Run Code Online (Sandbox Code Playgroud)

ls filesystems compatibility shell-script

13
推荐指数
1
解决办法
870
查看次数

使用需要身份验证的 Samba 打印机进行命令行打印

有没有办法通过在命令行上提供凭据(例如,使用lpr)来打印到需要身份验证的 Samba 打印机?

我设法将凭据存储在 GNOME Keyring 中,当我使用桌面会话登录时,我可以使用lpr.

有没有办法:

  • 提供凭证给 lpr
  • 验证队列中的作业

远程登录 (SSH) 时?

编辑

我知道可以为所有用户存储一组凭据(直接在打印机 URI 中的 CUPS 中),但我们需要每个用户使用他/她自己的凭据进行身份验证。

authentication smb lpr

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

POSIX 测试和 -a

我用checkbashisms检查了我的脚本,并收到以下警告:

possible bashism in check_ssl_cert line 821 (test -a/-o):
if [ -n "${ALTNAMES}" -a -n "${COMMON_NAME}" ] ; then
Run Code Online (Sandbox Code Playgroud)

POSIX 规范的第 4.62.4 节中,我发现

主要 -a 主要 执行二进制和主要和主要的结果。-a 运算符优先于 -o 运算符。

为什么-a-o考虑非便携?

shell shell-script posix test

9
推荐指数
1
解决办法
1063
查看次数

没有 GNU 工具的日期计算

我必须在 shell 脚本中执行一些日期计算和转换。例如计算格式化为Nov 28 20:27:19 2012 GMT今天的日期之间的天数差异。

有几种可能性(GNU dategawkperl等),但我希望能够在没有 GNU 工具的系统上运行它(例如,BSD、Solaris 等)

目前我拥有的最便携的解决方案是 Perl,但它可能需要安装额外的模块来进行日期转换。

我应该选择什么?

编辑:查看评论我意识到我需要澄清我正在编写的工具将公开分发。我不是在寻找在我的机器上执行计算或如何安装 GNU 工具的方法。

我想使用可能在大多数机器上找到的工具。

date

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

netstat 显示一个没有进程的 ESTABLISHED 连接

我正在调试 postfix 的一些问题。当我建立连接时,没有任何反应并netstat显示:

$ netstat -anp
...
tcp        0      0 129.132.202.106:25          129.132.179.232:60154       ESTABLISHED -                   
Run Code Online (Sandbox Code Playgroud)

为什么缺少流程?

lsof 不显示已建立的连接

$ lsof -n -i :25
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
master   6139    root   11u  IPv4 472858      0t0  TCP 127.0.0.1:smtp (LISTEN)
master  20033    root   11u  IPv4 523921      0t0  TCP 129.132.202.106:smtp (LISTEN)
smtpd   20042 postfix    6u  IPv4 523921      0t0  TCP 129.132.202.106:smtp (LISTEN)
Run Code Online (Sandbox Code Playgroud)

交通:

11:26:44.182443 IP 129.132.179.232.59517 > 129.132.202.106.25: S 3522488764:3522488764(0) win 65535 <mss 1460,nop,wscale 5,nop,nop,timestamp 73851028 0,sackOK,eol>
11:26:44.182831 IP …
Run Code Online (Sandbox Code Playgroud)

networking netstat

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

openssl and OCSP

I'm trying to check the revocation of certificates in a script but I'm getting the following error:

unable to load certificate
140735258465104:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:703:Expecting: TRUSTED CERTIFICATE
Run Code Online (Sandbox Code Playgroud)

Here are the steps (using www.google.com as an example).

  1. 获取证书

    $ echo 'Q' | openssl s_client -connect www.google.com:443 > google.crt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 提取发行者的 URI

    $ openssl x509 -in google.crt -text -noout | grep 'CA Issuers' | \
        sed -e "s/^.*CA Issuers - URI://
    
    Run Code Online (Sandbox Code Playgroud)

    这给 http://pki.google.com/GIAG2.crt

  3. 获取颁发者证书

    $ curl --silent http://pki.google.com/GIAG2.crt > issuer.crt
    
    Run Code Online (Sandbox Code Playgroud)
  4. 提取 OCSP URI …

openssl

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

查找和否定 -iname 条件

我正在尝试查找名称中包含“支柱”(案例激励)且不包含“缓存”(也不区分大小写)的所有文件

find . -iname '*pillar*' -and -not -iname '*cache*'
Run Code Online (Sandbox Code Playgroud)

但它不像我发现的那样工作(除其他外)

./Caches/Metadata/Safari/History/https:%2F%2Fwww.google.ch%2Fsearch?q=pillars+of+eternity+dropbox&client=safari&rls=en&biw=1440&bih=726&ei=CnBDVbhXxulSnLaBwAk&start=10&sa=N%23.webhistory
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

find

4
推荐指数
2
解决办法
756
查看次数

grep -q 与 openssl 不起作用

如果我执行

openssl x509 -in ./somecert -text | grep SCTs
Run Code Online (Sandbox Code Playgroud)

我得到了预期的输出。如果我使用grep -q

openssl x509 -in ./somecert -text | grep -q SCTs
Run Code Online (Sandbox Code Playgroud)

我得到

unable to write certificate
139863258654608:error:09072007:PEM routines:PEM_write_bio:BUF lib:pem_lib.c:659:
Run Code Online (Sandbox Code Playgroud)

似乎grep是不接受管道输入......

我错过了什么?

grep pipe openssl

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

OpenSSL s_client 未检测到 STARTTLS

我正在尝试获取我的邮件服务器的证书 s_client

$ /opt/local/bin/openssl s_client   -starttls smtp -connect corti.li:25
CONNECTED(00000003)
didn't found starttls in server response, try anyway...
140735895012360:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:794:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 307 bytes and written 343 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity …
Run Code Online (Sandbox Code Playgroud)

smtp ssl openssl

3
推荐指数
1
解决办法
5271
查看次数

Bash 4,扩展和小写

我看到在 Bash > 4.0 中变量扩展用于小写变量。例如

echo ${variable,,}
Run Code Online (Sandbox Code Playgroud)

阅读手册页我真的不明白为什么 shell 将字符串转换为小写。

序列表达式采用 {x..y[..incr]} 形式,其中 x 和 y 是整数或单个字符,而 incr 是一个可选增量,是一个整数。当提供整数时,表达式扩展到 x 和 y 之间的每个数字,包括。提供的整数可能以“0”为前缀,以强制每个术语具有相同的宽度。当 x 或 y 以零开头时,shell 会尝试强制所有生成的项包含相同数量的数字,并在必要时填充零。当提供字符时,表达式使用默认的 C 语言环境按字典顺序扩展到 x 和 y 之间的每个字符,包括两个字符。请注意,x 和 y 必须属于同一类型。当提供增量时,它被用作每个术语之间的差异。默认增量为 1 或 -1(视情况而定)。

为什么变量转换为小写?

bash

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