我已经看到了关于需要对远程 ssh 命令的参数进行双重转义的问题和答案。我的问题是:第二次解析究竟在何时何地完成?
如果我运行以下命令:
$ ssh otherhost pstree -a -p
Run Code Online (Sandbox Code Playgroud)
我在输出中看到以下内容:
|-sshd,3736
| `-sshd,1102
| `-sshd,1109
| `-pstree,1112 -a -p
Run Code Online (Sandbox Code Playgroud)
远程命令 ( pstree)的父进程是sshd,那里似乎没有任何外壳程序可以解析远程命令的命令行参数,因此似乎不需要双引号或转义(但它绝对是)。相反,如果我先在那里 ssh 并获得登录 shell,然后运行,pstree -a -p我会在输出中看到以下内容:
??sshd,3736
? ??sshd,3733
? ??sshd,3735
? ??bash,3737
? ??pstree,4130 -a -p
Run Code Online (Sandbox Code Playgroud)
很明显,那里有一个bashshell 可以在这种情况下进行命令行解析。但是我直接使用远程命令的情况,好像没有shell,那为什么还要双引号呢?
我希望能够统计我通过 bash 运行最多的程序。有没有办法在 bash 中插入某种钩子,以便它记录它执行的所有内容?
请注意,仅查看 bash 历史文件还不够。我可以从历史记录的每一行中打印出第一个标记,但这不会获得管道和进程替换。我想要以下内容:
$ ls /usr/bin/* | fgrep $(echo grep)
Run Code Online (Sandbox Code Playgroud)
记录ls、fgrep、 和echo分别运行一次。以及以下内容:
$ for file in /usr/bin/*; do stat $file; echo $file; done
Run Code Online (Sandbox Code Playgroud)
应注意stat并echo运行。由于for是 bash 流程控制语句,因此不会被记录。
是否应该记录 shell 内置函数和函数是有争议的(也许只是记录它们的内容)。stat在上面的示例中,是否echo应该记录一次或多次运行循环也存在争议。但我可以以最简单的方式处理输出。
运行 bash-x显示它确实有一些内部机制来挂钩进程exec并记录正在发生的事情。还有其他方法可以进去吗?
我有以下脚本:
#!/bin/sh
mkdir -p /tmp/test/foo
cd /tmp/test
unset CDPATH
echo "TEST1: Current working directory: ${PWD}"
echo "TEST1: attempting to 'cd foo'"
cd foo
echo "TEST1: Current working directory: ${PWD}"
cd /tmp/test
CDPATH=/tmp
echo "TEST2: Current working directory: ${PWD}"
echo "TEST2: attempting to 'cd foo'"
cd foo
echo "TEST2: Current working directory: ${PWD}"
Run Code Online (Sandbox Code Playgroud)
打印出来:
$ ./cdpath.sh
TEST1: Current working directory: /tmp/test
TEST1: attempting to 'cd foo'
TEST1: Current working directory: /tmp/test/foo
TEST2: Current working directory: /tmp/test
TEST2: attempting to 'cd foo' …Run Code Online (Sandbox Code Playgroud)