Используя подстановочный знак в Unix, найдите путь команды

1691
LLJ

Эта команда с * в пути поиска отлично работает на локальном сервере

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

2 ответа на вопрос

2
Matteo

*Расширяется вашей локальной оболочки. Вы должны процитировать свой аргумент

ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208" 
Точно. * Никогда не прибывает на удаленный компьютер. Он был расширен до того, как вы достигнете этой стадии. Hennes 8 лет назад 0
1
eggo

As @Matteo said, you need to escape the * from your local shell. He's done that in his first example:

ssh Svr1 /usr/local/bin/sudo -S find '/path/*/foo/' -name "20160208" 

As alternative, either of these should work as well, as the single quotes ('...') and backslash (\) "hide" the * wildcard from your local shell:

ssh -t Svr1 /usr/local/bin/sudo 'find /path/*/foo/ -name *20160208' 

or

ssh -t Svr1 /usr/local/bin/sudo find /path/\*/foo/ -name \*20160208 

As a side note, see that I've included a -t argument to ssh so that sudo has a tty through which to ask for my password, which is MUCH better than putting the password on the command line, IMO. If you must pipe the sudo password in, I suggest doing it via cat secret.txt | find ..., which keeps the password out of the command line which is potentially visible to ps and to anyone with access to your shell history (including ~/.history and variants)