Простой способ проверить 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
Здесь мы сталкиваемся с двумя разными проблемами:
sshfs
; 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.
В соответствии с тем, что предложил @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
, чтобы избежать проблем с сохранением. Вы найдете множество ссылок и советов по автоматизации этого процесса.
ХТХ