Используя подстановочный знак в 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
и варианты)