zsh: правила завершения для ssh

Простое решение, как derobert предложил в комментарии, состоит в том, чтобы оставить (большинство) существующих файлов там, где они есть, переместить только один каталог, который будет получать большие файлы, и создать символическую ссылку, чтобы ожидаемый путь указывал на то место, где файлы будут храниться на самом деле. Например, если вы переделываете сервер для хранения большого количества почты, вы можете сделать

service postfix stop         # or whatever you need to do to stop writing to /var/mail
mv /var/mail /home
ln -s ../home/mail /var/mail
service postfix start

Если файлы попадут в новый каталог, вам нечего перемещать, просто создайте каталог в большом разделе и создайте символическую ссылку на него в /var.

Если файлы действительно должны находиться под /var, вы можете переместить /home на маленький раздел и переместить /var на большой раздел. Но чтобы сделать это безопасно, вам нужно убедиться, что ничто не использует перемещаемые файлы, что проблематично, если у вас нет физического доступа.

4
06.07.2017, 21:53
3 ответа

Я бы порекомендовал сделать это, чтобы вместо этого использовать ваш (и системный )файл известных хостов ssh:

zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'

Если вы все еще хотите использовать /etc/hosts вместо этого:

strip='[:blank:]#[^[:blank:]]#'
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${(s: :)${(ps:\t:)${${(f)~~"$(</etc/hosts)"}%%\#*}##${~strip}}})'

Удачи!

5
27.01.2020, 20:59

Добавить функцию фильтра в/usr/share/zsh/functions/Completion/Unix/_hosts:

provide_missing_ip() {
   while read x ; do 
      set -- $x
      if [ ! "$1" ] || [ "${1%%[^#]*}" ] || [ "$2" ] ; then
          echo "$x"
      else
          ip=`dig +short $2`
          [ "$ip" ] || ip="240.0.0.0"
          printf "%s\t%s\n" $1 $2
      fi
   done
}

Как это работает:

  1. Если есть две записи, пробел или комментарий, просто выведите их.
  2. Если есть только имя хоста, попробуйте предоставить IP-адрес с dig.
  3. В противном случае, (чего не должно произойти, но, скажем, это намеренно поддельное имя хоста для целей тестирования ), используйте безвредный фиктивный IP-адрес " 240.0.0.0 ", (см.ответ Бандрами на " IP-адрес, эквивалентный /dev/null ").

Используйте новую функцию для анализа вывода getentили < /etc/hostsв проблемном коде завершения:

if (( ${+commands[getent]} )); then
  _cache_hosts=(${(s: :)${(ps:\t:)${(f)~~"$(_call_program hosts getent hosts 2>/dev/null | provide_missing_ip )"}##${~ipstrip}}})
else
  _cache_hosts=(${(s: :)${(ps:\t:)${${(f)~~"$(provide_missing_ip </etc/hosts)"}%%\#*}##${~ipstrip}}})
fi
1
27.01.2020, 20:59

Файл hostsдолжен быть в формате IP_address canonical_hostname [aliases...], поэтому ваш подход должен заключаться в том, чтобы исправить ваш файл hosts, а не заставить один фрагмент программы работать с вашим поврежденным файлом. Другие программы тоже могут работать с проблемами, если ваш hostsнеисправен, так что это будет единственное разумное решение для вашего варианта использования. Если вы ориентируетесь на динамический IP-адрес и не хотите использовать какой-либо из лучших обходных путей, представленных выше, рассмотрите возможность написания сценария, который динамически изменяет ваш hostsв соответствии с этим изменяющимся адресом.

0
27.01.2020, 20:59

Теги

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