Не удается сделать реверсию SSH-туннелирование в локальной сети

Функции управления подсказками Bash довольно статичны. Если требуется дополнительный контроль, можно включить переменные в запрос; убедитесь, что вы не отключили параметр promptvars .

PS1='${PWD#"${PWD%/*/*}/"} \$ '

Обратите внимание на отдельные кавычки: расширение переменной должно происходить во время отображения подсказки, а не во время определения переменной PS1 .

Если требуется больше контроля над отображением, можно использовать замены команд. Например, приведенный выше фрагмент теряет аббревиатуру ~ для домашнего каталога.

PS1='$(case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac; printf %s "$HPWD") \$ '

Этот код является довольно громоздким, поэтому вместо того, чтобы вставлять его в переменную PS1 , можно использовать переменную PROMPT _ COMMAND для запуска кода для установки HPWD , а затем использовать ее в подсказке.

PROMPT_COMMAND='case $PWD in
        $HOME) HPWD="~";;
        $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        $HOME/*) HPWD="~/${PWD##*/}";;
        /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
        *) HPWD="$PWD";;
      esac'
PS1='$HPWD \$'

Поскольку укороченный запрос изменялся только при изменении каталога, его не нужно пересчитывать при каждом отображении запроса. Bash не предоставляет крюк, который выполняется при текущем изменении каталога, но вы можете смоделировать его , переопределяя cd и его кузины.

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
chpwd () {
  case $PWD in
    $HOME) HPWD="~";;
    $HOME/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    $HOME/*) HPWD="~/${PWD##*/}";;
    /*/*/*) HPWD="${PWD#"${PWD%/*/*}/"}";;
    *) HPWD="$PWD";;
  esac
}
PS1='$HPWD \$'

Обратите внимание, что экспорт PS1 не требуется, так как это настройка оболочки, а не переменная среды. Настройки bash PS1 не будут поняты другими оболочками.

P.S. Если вам нужна приятная интерактивная оболочка, переключитесь на zsh , где все эти (подсказки % расширения, в основном охватывающие tcsh's, chpwd и т.д.) являются собственными функциями.

PS1='%2~ %# '

-121--27458-

Используйте set -e

Можно написать:

#!/bin/bash
set -e

# function email_success {...}

# function email_fail { ... }

if /usr/bin/perl perlscript.pl; then
  email_success
else
  email_fail
  exit 1
fi

#More commands to be executed if its successful 

Объяснение :

Справочное руководство Bash говорит:

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

Условные конструкции (if) :

Синтаксис команды if

 if test-commands; тогда
последовательные команды;
[elif more-test-commands; тогда
дополнительные последствия;]
[в противном случае взаимозамены;]
fi

Выполняется список тестовых команд, и если его состояние возврата равно нулю, выполняется список последовательных команд. Если присутствует «else alternate-consepcents», и конечная команда в предложении final if или elif имеет ненулевое состояние выхода, то выполняется alternate-consepcents.

См. также: Используйте неофициальный режим Bash Strict (если не смотреть отладку)

-121--174574-

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

Обратите внимание, что независимо от того, запускаете ли вы процесс в фоновом режиме,его можно перемещать между фоном и передним планом по желанию (с помощью ^ Z и bg или с помощью fg ). В этом отношении все рабочие места равны. Единственным ограничением является то, что в любой момент времени может быть не более одного задания переднего плана, и фоновые задания останавливаются, если они пытаются использовать tty оболочки.

При отсутствии задания основной системы оболочка считывает следующую команду (из файла сценария или stdin) и выполняет ее.

-1
28.08.2018, 20:02
1 ответ

На машине _B

ssh -g -L 12345:localhost:22 Machine_A

На машине _C

ssh -p 12345 Machine_B
0
28.01.2020, 05:12

Теги

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