1

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

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 ответа2

2

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

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

Как сказал @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 и варианты)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .