фон
Я всегда отслеживаю логи (как ошибки, так и информацию). Для этого требуется выполнить следующие шаги вручную: 1. подключиться к серверу по ssh 2. перейти в каталог журналов 3. определитьпоследнийфайл, который является либо ошибкой, либо информацией 4. загляните в него
Вот как выглядит типичный каталог журналов:
error-2017-12-11.log error-2017-12-30.log error-2018-01-05.log error-2018-01-11.log error-2018-01-17.log error-2018-01-23.log error-2018-01-29.log info-2017-12-26.log info-2018-01-01.log info-2018-01-07.log info-2018-01-13.log info-2018-01-19.log info-2018-01-25.log info-2018-01-31.log
error-2017-12-13.log error-2017-12-31.log error-2018-01-06.log error-2018-01-12.log error-2018-01-18.log error-2018-01-24.log error-2018-01-30.log info-2017-12-27.log info-2018-01-02.log info-2018-01-08.log info-2018-01-14.log info-2018-01-20.log info-2018-01-26.log info-2018-02-01.log
error-2017-12-26.log error-2018-01-01.log error-2018-01-07.log error-2018-01-13.log error-2018-01-19.log error-2018-01-25.log error-2018-01-31.log info-2017-12-28.log info-2018-01-03.log info-2018-01-09.log info-2018-01-15.log info-2018-01-21.log info-2018-01-27.log info-2018-02-02.log
error-2017-12-27.log error-2018-01-02.log error-2018-01-08.log error-2018-01-14.log error-2018-01-20.log error-2018-01-26.log error-2018-02-01.log info-2017-12-29.log info-2018-01-04.log info-2018-01-10.log info-2018-01-16.log info-2018-01-22.log info-2018-01-28.log info-2018-02-03.log
error-2017-12-28.log error-2018-01-03.log error-2018-01-09.log error-2018-01-15.log error-2018-01-21.log error-2018-01-27.log error-2018-02-02.log info-2017-12-30.log info-2018-01-05.log info-2018-01-11.log info-2018-01-17.log info-2018-01-23.log info-2018-01-29.log outfile
error-2017-12-29.log error-2018-01-04.log error-2018-01-10.log error-2018-01-16.log error-2018-01-22.log error-2018-01-28.log error-2018-02-03.log info-2017-12-31.log info-2018-01-06.log info-2018-01-12.log info-2018-01-18.log info-2018-01-24.log info-2018-01-30.log
Я хочу создать псевдоним команды, который позволит мне сделать это мгновенно с удаленной машины.
вопрос
Сделать это одной командой на удаленном сервере легко (grep info
для получения информации и error
для выявления ошибок):
tail -f `ls -Art | grep info | tail -n 1`
но когда я пытаюсь запустить этот псевдоним:
alias logger='ssh -i /file.pub user@host -t
"cd /path/to/logs; tail -f `ls -Art | grep info | tail -n 1`; bash --login"'
Я получаю эту ошибку:
tail: cannot open '.viminfo' for reading: No such file or directory
tail: no files remaining
идеи?
обновлять
опция функции
function totprod1log() {
ssh -i file.pub user@host;
cd /path/to/logs;
tail -f $(ls -Art | grep info | tail -n 1);
bash --login;
}
эта опция просто заставила меня войти в систему на aws, но ничего больше
решение1
Когда ваш псевдоним запускается ssh ... "cd ...; commands using backquote that I can't easily show on Stack"
, это дает вашей оболочке команду запустить ls ... | ...
конвейер в обратных кавычкахлокально, который находит имя новейшего файла в текущем каталоге вашей системы и отправляет это имя файла как часть команды в удаленную систему, где, конечно, попытка отследить этот файл не сработает.
Ваши варианты:
# ugly quoting to work with doublequotes
alias logger='ssh ... "cd ...; tail -f \`ls ... | ...\`; bash --login"'
# shell function or script, which let you use clearer singlequotes
logger(){
ssh ... 'cd ...; tail -f `ls ... | ...`; bash --login'
}
# or
cat <<"END" >logger # use some dir (early) in $PATH
ssh ... 'cd ...; tail -f `ls ... | ...`; bash --login'
END
chmod +x logger
В общем случае вы также можете предоставить команду каквходк удаленной оболочке вместо командной строки (аргумент)
ssh ... <<"END" # shouldn't need -t in this case
cd ...; tail -f `ls ... | ...`
END
но это не сочетается с вашим явным, хотя и невысказанным и необъяснимым желанием продолжать bash --login
работу после выхода из tail
.
Обратите внимание, что в двух случаях heredoc строка-разделитель заключена в кавычки, поэтому локальная оболочка НЕ заменяет обратные кавычки или некоторые другие элементы в данных.
И во всех случаях было бы лучше использовать новый $( ... )
синтаксис для подстановки команд вместо старого синтаксиса обратных кавычек — особенно для вопросов на Stack, где обратные кавычки мешают (сильно? в большинстве случаев?) форматированию без кодовых блоков.