Запрос на отражение точки монтирования sshfs?

Простой способ проверить ssh служба запущена и работает локально на гостевой системе:

ssh localhost

или:

netstat -an | grep -w LISTEN | grep -w 22

Если не установлена, посмотрите https://askubuntu.com/questions/51925/how-do-i-configure-a -new-ubuntu-installation-to-accept-ssh-connections

2
21.02.2019, 14:16
2 ответа

Здесь мы сталкиваемся с двумя разными проблемами:

  1. Как узнать, находится ли текущий рабочий каталог (PWD )в файловой системе, смонтированной sshfs;
  2. Как отразить пункт 1 в командной строке.

Является ли текущий рабочий каталог частью файловой системы, смонтированной sshfs?

Сравнение PWD с точками подключения ненадежно. Это может не сработать, например, если компонент вашего PWD является символической ссылкой на точку монтирования.

В GNU/Linux такие инструменты, как dfи findmnt, могут определять точку монтирования, в которой находится каталог. Кроме того, оба могут сообщать об атрибуте FSTYPEфайловой системы, для которого установлено значение fuse.sshfsдля тех, которые смонтированы с помощью sshfs.

Таким образом, вы можете проверить с помощью:

# df always prints a header line, we want to skip it
[ "fuse.sshfs" = "$(df --output=fstype. | tail -n +2)" ] &&...

или:

[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target.)" ] &&...

Вы можете обернуть этот тест в скрипт и сделать его доступным в вашем PATH. Здесь мы назовем этоcheck_sshfs_mp:

#!/bin/sh
[ "fuse.sshfs" = "$(findmnt --noheadings --output=FSTYPE --target.)" ] && exit 0
exit 1

Как настроить приглашение оболочки в зависимости от точки монтирования, в которой мы находимся?

Как в bash, так и в zshвы можете установить переменную оболочки PS1, которая раскрывается как основное приглашение.

В bashвы можете сделать это в обертках для соответствующих функций :cd, pushdиpopd(кредитов:благодаря этому ответу на «Условный PS1» за напоминание мне cdне единственный ), добавив этот код в свой~/.bashrc:

cd () { builtin cd "$@" && chpwd; }

pushd () { builtin pushd "$@" && chpwd; }

popd () { builtin popd "$@" && chpwd; }

chpwd () {
    normal='\[\e[0m\]'
    red='\[\e[1;31m\]'
    PS1='[\u@\h \W]\$ '
    if command -v check_sshfs_mp > /dev/null 2>&1; then
        check_sshfs_mp && PS1='[\u@\h '"$red"'R'"$normal"' \W]\$ '
    fi
}

Функция chpwdвызывает check_sshfs_mpи, если ее статус выхода равен 0, добавляет одну красную букву Rк PS1.
Вы можете настроить значение по умолчанию PS1в соответствии со своими предпочтениями.

В zshкак-то проще, так как zshвыполняет специальную функцию chpwdвсякий раз, когда изменяется текущий рабочий каталог (ссылки :The Z Shell Manual, Специальные функции). Вы можете добавить функцию настройки подсказки -в массив функций ловушек, которые выполняются вместе с chpwd.
Предполагая, что вы не используете вклады пользователей , которые мешают настройке подсказок, вы можете добавить этот код в свой~/.zshrc:

chpwd_check_sshfs_mp () {
    PS1='%m%# '
    if command -v check_sshfs_mp > /dev/null 2>&1; then
        check_sshfs_mp && PS1='%m %F{red}R%f %# '
    fi
}
chpwd_functions+=( chpwd_check_sshfs_mp )

Опять же, мы просто добавляем красный Rк основному приглашению, когда chech_sshfs_mpзавершается успешно.

Обратите внимание, что обертывание cdи добавление функции ловушки chpwd_functionsне гарантирует правильную установку подсказки, если PWD, в котором запущен ваш терминал, находится в смонтированной файловой системе sshfs. Вам потребуется по крайней мере cd, чтобы вызвать правильное приглашение, и это может ввести в заблуждение.

Вклады пользователей в zsh, выполняющие темы подсказок, потребуют специальных -специальных решений для настройки подсказок.
Тем не менее, вы можете отключить темы подсказок с помощью

prompt off

, чтобы поэкспериментировать с этим кодом.


Интеграция вопросов, поднятых в комментариях кzsh:

Если вы предпочитаете указывать подсказки с помощью управляющих последовательностей ANSI(вместо имен цветов ), вы можете изменить строку назначения PS1в приведенном выше фрагменте кода на:

check_sshfs_mp && PS1="$(print '%m %{\e[1;31m%}R%{\e[0m%} %# ')"

или

PS1='%m'"$(check_sshfs_mp && print '%{\e[1;31m%} R %{\e[0m%}')"'%# '

Обратите внимание, что printтребуется для превращения \eв фактические управляющие символы, а форма %{...%}необходима, чтобы код подсказки не работал неправильно. Ссылка:zshЧасто задаваемые вопросы:Как получить цветные подсказки на моем color xterm?

Если вы предпочитаете, чтобы проверка выполнялась каждый раз, когда устанавливается основная подсказка, вы можете не добавлять функцию перехвата в chpwd_functionsи добавить в свой.zshrc:

setopt PROMPT_SUBST
export PS1='%m$(check_sshfs_mp && print "%{\e[1;31m%} R %{\e[0m%}")%# '

Параметр PROMPT_SUBSTнеобходим для включения подстановки команд при отображении подсказки. См.:Расширение подсказки в Руководстве по Z Shell.

3
27.01.2020, 21:55

В соответствии с тем, что предложил @fra.san, вы можете изменить приглашение LOCAL, изменив PS1так, чтобы оно отражало тот факт, что папка в пути была смонтирована с использованием sshfs.

Сначала убедитесь, что ваш терминал поддерживает цветные подсказки. Включите следующее в год ~/.kshrcили~/.bashrc:

# Option is turned off by default to not distract the user.
force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
    # you have color support; assume it's compliant with Ecma-48
    # (ISO/IEC-6429). If support lacks use `setf` rather than `setaf`.
        color_prompt=yes
    else
        color_prompt=""
    fi
fi

Далее, каждый раз, когда вы монтируете удаленный том в локальной ФС с помощью оболочки sshfs_wrp, автоматически добавляйте путь к этому подключенному удаленному тому во временный файл, например. /tmp/tmp_rem_vol. Вы можете сделать это с помощью простой оболочки для команды sshfs :

.
#!/usr/bin/sh
# script name: sshfs_wrp   # wrapper for sshfs
mount_path="$( echo "$@"| cut -d" " -f $# )"  # usually last parameter to `sshfs`
# Note: above will break when parameters passed to sshfs_wrp 
# contain blanks between quotes. 
echo "$mount_path" >> /tmp/tmp_rem_vol
sshfs "$@" 
exit 0

Убедитесь, что сценарий является исполняемым и его расположение доступно с помощью переменной среды PATH.

Затем определите функцию в вашем ~/.kshrcили ~/.bashrc, чтобы установить флаговую переменную remFlagв [R]в случае, если строка "$(pwd)"указывает, что вы в настоящее время работаете внутри поддерева удаленного тома, ранее смонтированного с sshfs_wrp. Я использовал caseдля переносимости.
РЕДАКТИРОВАТЬ:Обратите внимание, что как только вы найдете совпадение в секции соответствия шаблону case, вы должны выйти из цикла while.

function check_rem_vol () {
    if [ -s /tmp/tmp_rem_vol ] ; then
        while read rem_vol; do
            case "$(pwd)" in 
                # check whether pwd contains sshfs_wrp-mounted volume 
                *"${rem_vol}"*) remFlag="[R]" ; break  ;;  
                *) remFlag="" ;;
            esac
        done < /tmp/tmp_rem_vol
    else
        remFlag=""
    fi
    echo "$remFlag"
}

Наконец, измените приглашение yr PS1на yr ~/.kshrcили ~/.bashrc, включив в приглашение флаг удаленного тома rem_volярко-зеленого цвета на случай, если какой-либо удаленный том был смонтирован с использованием sshfs_wrp.

if [ "$color_prompt" = yes ]; then
    # For Debian based systems only
    #PS1="${debian_chroot:+($debian_chroot)}\[\e[0;38;5;166m\][\#/\!]\[\e[1;34m\] \w\[\e[38;5;46m\] \$(check_rem_vol)\[\e[1;38;5;166m\]>\[\e[0m\]"

    # For Archlinux
    PS1="\\[\\e[0;38;5;166m\\][\\#/\\!]\\[\\e[1;34m\\] \\w\\[\\e[38;5;46m\\] \$(check_rem_vol)\\[\\e[1;38;5;166m\\]\\> \\[\\e[0m\\]"
else
    # For Debian based systems only
    #PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
    #PS1="${debian_chroot:+}[\#/\!] \[\w \$(check_rem_vol)\]>"

    # For Archlinux
    PS1="[\\#/\\!] \\[\\w \$(check_rem_vol)\\]>"
fi
export PS1
unset color_prompt force_color_prompt

Это решение можно улучшить, чтобы уменьшить количество движущихся частей и улучшить создание /tmp/tmp_rem_volвременного файла или файлов в случае, если сосуществует более одного соединения ssh и удаленные тома монтируются с разных удаленных хостов.

Это должно работать как для одного соединения ssh, так и для оболочки bashили kshна платформах Debian или Arch Lx.

При удаленном -монтировании удаленного тома (с ), или при выходе из сеанса, или при закрытии ssh-соединения, вы также должны позаботиться об удалении /tmp/tmp_rem_vol, чтобы избежать проблем с сохранением. Вы найдете множество ссылок и советов по автоматизации этого процесса.

ХТХ

2
27.01.2020, 21:55

Теги

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