使用函数
function fail() {
local msg="$*"
echo $msg at
for i in ${!FUNCNAME[@]}; do
echo " ${FUNCNAME[$i]} ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
done
exit 1
}
当它被调用退出时,我得到了一个很好的堆栈跟踪。如果我能获取调用堆栈上函数的参数,信息量会更大。这可能吗?
使用函数
function fail() {
local msg="$*"
echo $msg at
for i in ${!FUNCNAME[@]}; do
echo " ${FUNCNAME[$i]} ${BASH_SOURCE[$i]}:${BASH_LINENO[$i]}"
done
exit 1
}
当它被调用退出时,我得到了一个很好的堆栈跟踪。如果我能获取调用堆栈上函数的参数,信息量会更大。这可能吗?
pass程序是一个命令行实用程序,用于将密码和自由格式的额外数据存储在使用 gpg 加密的小文件中。它特别提供了一个 grep 子命令,用于通过额外数据查找密码。
但是这个 grep 子命令在我的计算机上运行速度非常慢。我存储了近 200 个密码,每个文件的内部解密方式gpg
如下(time
当然,前面没有):
% time gpg -d --quiet --yes --compress-algo=none --no-encrypt-to stackoverflow.gpg
the password output
user=0,000 sys=0,006 wall=0,382 (1,61)
挂钟时间大约为 0.4 秒,也就是说,grep 所有文件需要大约 1 分钟的时间。
正在gpg-agent
运行并且我有这个版本:
gpg(GnuPG)2.2.27
有两个原因导致速度很慢:
gpg
和通信gpg-agent
很慢,这是因为用户+系统时间相比之下较少。gpg-agent
很慢,事实是,pass grep
运行一次后它的累计 CPU 时间增加了 60 秒,与完整运行的总时间非常吻合。两者合在一起,都指向gpg-agent
,尽管我不知道为什么代理会这么慢。ps
我看到它运行如下
/bin/gpg-agent --sh --daemon
有人可以解释一下每个文件代理大约 0.3 CPU 秒是否合理,或者是否有办法改进这一点?
编辑:进一步的发现
附加strace
到代理后,我发现了这一点:
20200 14:57:03.701648 getrusage(RUSAGE_SELF, {ru_utime={tv_sec=133, tv_usec=890780}, ru_stime={tv_sec=0, tv_usec=99975}, ...}) = 0
20200 14:57:03.701666 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, {tv_sec=133, tv_nsec=990762100}) = 0
20200 14:57:04.063523 getpid() = 18035
clock_gettime
通话之间间隔 360 毫秒getpid
。
使用 ltrace 的话:
20472 15:04:55.035574 strlen("my-password-here") = 10
20472 15:04:55.035641 gcry_kdf_derive(0x7d884b82c008, 10, 19, 2) = 0
20472 15:04:55.394727 gcry_cipher_setkey(0x7d884b82cbc0, 0x7d884b82c030, 16, 0x7d884b83c000) = 0
所以gcry_kdf_derive
需要 360 毫秒。无论它做什么,我是否可以通过一些配置设置让它将其结果缓存几秒钟。(... 去获取源代码)。
尝试这个
echo 'Ü X' | awk '{printf("|% 2s|% 2s|\n", $1, $2)}'
对于 的输出|Ü| X|
。显然awk
计算的是字节长度,而不是 的字符长度Ü
,因此计数为 2,并且不需要用空格进行左填充,就像 一样X
。
是否可以awk
在计算模式字符长度%<count>s
printf
而不是字节长度的模式下运行?
存在同样的问题:bash
https : //superuser.com/a/1599024/345087。我希望答案不一样:“passthrough to libc printf”:-/printf
编辑而不是评论以获得更好的可见性:我没有使用但gawk
为我安装的任何版本的 ubuntu 22.04。我没有想到gawk
这些天可以安装任何东西:-/感谢您的详细回答。
假设有一些服务器在 remotehost.some.where:4444 上运行。我有一个坚持连接到 localhost:5555 的软件。ssh
我可以转发这个
ssh -L 5555:remotehost.some.where:4444 myuser@localhost
但这需要到 localhost 的不必要的 ssh 连接,添加-N
不会阻止。如何在没有登录的情况下进行此端口转发,可能使用其他工具?