此命令在查找路径中带有 *,在本地服务器上可以正常工作
Svr1$ find /path/*/foo/ -name "*20160208"
当我从另一台服务器远程尝试此操作时,它不起作用
Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/sudo -S find /path/*/foo/ -name "*20160208*"
错误信息是:
find: stat() error /path/*/foo/: No such file or directory
但是,如果我更改搜索路径以避免使用 *,它就可以正常工作。像这样:
Svr2$ echo $Pswd|ssh Svr1 /usr/local/bin/sudo -S find /path/ -name "*20160208*"
我做错了什么?我认为我需要引用或转义部分字符串,但我就是想不通。
非常感谢。
答案1
由您的本地 shell扩展*
。您应该引用您的论点
ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208"
答案2
正如@Matteo所说,您需要*
从本地 shell 中退出。他在第一个例子中做到了这一点:
ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208"
另外,以下任一种方式都可以正常工作,因为单引号 ( '...'
) 和反斜杠 ( )会在您的本地 shell 中\
“隐藏”通配符:*
ssh -t Svr1 /usr/local/bin/sudo 'find /path/*/foo/ -name *20160208'
或者
ssh -t Svr1 /usr/local/bin/sudo find /path/\*/foo/ -name \*20160208
附注:我已经添加了一个-t
参数,ssh
以便sudo
有一个 tty 来询问我的密码,即很多在我看来,这比在命令行上输入密码要好。如果你必须输入密码sudo
,我建议通过 进行输入,这样可以避免在命令行中输入密码,因为任何有权访问你的 shell 历史记录(包括和变体)的人都cat secret.txt | find ...
可能看到密码。ps
~/.history