Проверить, существует ли файл на удаленной машине с пробелами в имени файла и / или пути

Добавление метки времени к каждой строке верхнего вывода для отдельного запуска top -b можно легко сделать с помощью awk вместо grep для фильтрации, поскольку awk имеет встроенные функции времени и может вводить их в свои выходные данные.

Я не использую большинство этих программ, поэтому я добавил bash и ssh в фильтр в моих примерах...

Вы можете сделать это с помощью простой отметки времени эпохи (секунд с 01-ЯНВ-1970):

top -b | awk '/bash|ssh|tesseract|node|java|beam.smp|dockerd/ {print systime(), $0}'

Которая меньше для хранения и чище для просмотра:

bash-$ top -b | awk '/bash|ssh|tesseract|node|java|beam.smp|dockerd/ {print systime(), $0}'
1490018813  1229 root      20   0  891536  42868  28348 S   0.0  0.3  15:07.30 dockerd
1490018813  1240 root      20   0   65520   6208   5488 S   0.0  0.0   0:00.01 sshd
1490018813  2666 tim       20   0   24336   7136   3492 S   0.0  0.0   0:00.05 bash
1490018813  2710 tim       20   0   46984   5324   4644 S   0.0  0.0   0:09.08 ssh
1490018813  2783 root      20   0  105988   7184   6184 S   0.0  0.0   0:00.00 sshd
1490018813  2804 root      20   0  105988   7404   6408 S   0.0  0.0   0:00.00 sshd

Или с более читаемой для человека меткой времени.

top -b | awk '/bash|ssh|tesseract|node|java|beam.smp|dockerd/ {print strftime("%Y-%m-%d-%H:%M:%S", systime(), $0}'

Что быстрее понять:

bash-[541]$ top -b -n 3 | awk '/ssh|bash|java|dockerd/ {print strftime("%Y-%m-%d-%H:%M:%S", systime()), $0}'
2017-03-20-10:04:23  1229 root      20   0  891536  42868  28348 S   0.0  0.3  15:07.24 dockerd
2017-03-20-10:04:23  1240 root      20   0   65520   6208   5488 S   0.0  0.0   0:00.01 sshd
2017-03-20-10:04:23  2666 tim       20   0   24336   7136   3492 S   0.0  0.0   0:00.05 bash
2017-03-20-10:04:23  2710 tim       20   0   46984   5324   4644 S   0.0  0.0   0:09.08 ssh
2017-03-20-10:04:23  2783 root      20   0  105988   7184   6184 S   0.0  0.0   0:00.00 sshd
2017-03-20-10:04:23  2804 root      20   0  105988   7404   6408 S   0.0  0.0   0:00.00 sshd
2017-03-20-10:04:23  2909 tim       20   0  105988   5072   4072 S   0.0  0.0   0:00.20 sshd
2017-03-20-10:04:23  2931 tim       20   0  105988   4252   3224 S   0.0  0.0   0:00.00 sshd

5
20.10.2016, 02:36
2 ответа

Добавьте дополнительную пару кавычек, чтобы одна была для локальной оболочки, а другая - для удаленной оболочки, которая ssh ] работает.

$ dir=/tmp; file="foo bar"; 
$ ssh somewhere ls -l "'$dir/$file'"
-rw-r--r-- 1 foo foo 4194304 Oct 19 18:05 /tmp/foo bar
$ ssh somewhere [[ -f  "'$dir/$file'" ]] ; echo $?
0

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

Если имя файла не содержит одинарных кавычек, то есть. В этом случае у вас возникнут проблемы.

Чтобы обойти это, вам понадобится что-то, что добавляет к строке необходимые escape-символы. В некоторых системах есть printf "% q" , в новых версиях Bash есть расширение $ {var @ Q} , которое должно делать нечто подобное.

$ dir=/tmp; file="\$foo' bar"
$ fullpath="$(printf "%q" "$dir/$file")"
$ ssh somewhere ls -l "$fullpath"
-rw-r--r-- 1 foo foo 0 Oct 19 18:45 /tmp/$foo' bar
10
27.01.2020, 20:36

Я не уверен, что рекомендую это делать, но если только администратор вашего сервера и/или его системный дистр не ревностно относятся к безопасности, вы можете злоупотребить одним из (обычно) немногих envvar'ов, через которые ssh будет проходить:

export LC_MESSAGES='path/to/file with spaces'
if ssh $host '[ -f "$LC_MESSAGES" ]' ; then ...
-1
27.01.2020, 20:36

Теги

Похожие вопросы