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

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

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*"

Что я делаю неправильно? Я думаю, что мне нужно процитировать или избежать части строки, но я просто не могу понять это.

Большое спасибо.

2 ответа

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

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

Как сказал @Matteo, вам нужно избежать * из вашей локальной оболочки. Он сделал это в своем первом примере:

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

Как альтернатива, любой из них должен работать так же, как одиночные кавычки ('...') и обратный слеш (\) "спрятать" * подстановочный знак из вашей локальной оболочки:

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, через который можно запросить мой пароль, который НАМНОГО лучше, чем ввод пароля в командной строке, IMO. Если вы должны трубку sudo пароль, я предлагаю сделать это через cat secret.txt | find ..., который хранит пароль вне командной строки, которая потенциально видна ps и любому, у кого есть доступ к вашей истории оболочки (включая ~/.history и варианты)

Другие вопросы по тегам