我有一个本地 unix 套接字通过 SSH 隧道连接到远程实例上的另一个 unix 套接字:
ssh -N -L $HOME/my.sock:/var/run/another.sock
Run Code Online (Sandbox Code Playgroud)
然而,当我优雅地终止 ssh(即 ctrl+C 或 SIGTERM)时,$HOME/my.sock
仍然存在。看起来这没有正确清理。有这个选项/标志吗?
这是有问题的,因为如果我第二次运行该命令,它会由于现有的套接字文件而失败。(我看不到会覆盖现有套接字文件的“重用”标志/选项。)而且我宁愿不添加rm -f $HOME/my.sock
.
我有 zsh 5.3(通过 oh-my-zsh),如果我运行echo --message="foo!"
,我会在下一行得到未终止的报价提示:
$ echo --message="foo!"
dquote>
Run Code Online (Sandbox Code Playgroud)
这不会发生在 bash 中。
当我!
从参数中删除字符时,它工作正常:
$ echo --message="foo"
--message=foo
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?
我还应该注意,如果我回答未终止的引用提示"
并点击返回,我会得到这个输出,它完全删除!
:
$ echo --message="foo!"
dquote> "
--message=foo
Run Code Online (Sandbox Code Playgroud) 我正在使用 macOS 和rm
GNU coreutils 的工具(不是 macOS\xe2\x80\x99s 自己的rm
)。
所以我有一个脚本来清理一些目录,如下所示:
\n\nif [ -d "${cleanup_repo_clone_root}" ]; then\n echo "Cleaning up tmp directory: ${cleanup_repo_clone_root}"\n set -x; rm -rf -- "${cleanup_repo_clone_root}"\nfi\n
Run Code Online (Sandbox Code Playgroud)\n\n我扔了一个set -x
进去看看发生了什么。
它向我显示输出:
\n\n+ set -x\n+ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ\nrm: cannot remove \'/var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ\': Directory not empty\n
Run Code Online (Sandbox Code Playgroud)\n\n但如果我复制粘贴该 rm 命令并执行它,它就可以正常工作!
\n\n$ rm -rf -- /var/folders/h7/n46zg3md4l57vzsgxcs355/T/tmp.eizQw1iNBQ\n
Run Code Online (Sandbox Code Playgroud)\n\n这里发生了什么?
\n我正在尝试使用本地 Unix 域套接字,例如~/docker.sock
. 我希望它将所有内容代理到通过 SSH 在其他地方运行的远程 Unix 域套接字。(你可以在下面找到我正在尝试做的事情的图表)。
OpenSSH 支持这一点(这里有一个例子)。例如,此命令将远程服务器上的 MySQL 客户端连接代理到我的本地实例:
ssh -R/var/run/mysql.sock:/var/run/mysql.sock -R127.0.0.1:3306:/var/run/mysql.sock somehost
Run Code Online (Sandbox Code Playgroud)
但这不是我想要的样子。它将来自远程套接字的流量转发到我的本地套接字(我想要其他方式)。