Почему я должен сбросить огибающий Вар в tmux, когда я повторно прикрепляю?

Отвечать на Ваши два вопроса:

  • да, добавление и в конце строки сообщит, что Вы окружаете для запуска фонового процесса.
  • использование wait команда, можно попросить, чтобы оболочка ожидала всех процессов в фоновом режиме для окончания прежде, чем продолжиться дальше.

Вот сценарий, измененный так, чтобы j используется для отслеживания количество фоновых процессов. Когда NB_CONCURRENT_PROCESSES достигнут, сценарий сбросит j к 0 и ожидают всех фоновых процессов для окончания прежде, чем возобновить, что это - выполнение.

files=(./*.png)
nb_concurrent_processes=4
j=0
for f in "${files[@]}"
do
        echo "Processing $f file..."
        # take action on each file. $f store current file name
        ./pngout -s0 "$f" R"${f/\.\//}" &
        ((++j == nb_concurrent_processes)) && { j=0; wait; }
done
37
03.02.2017, 13:17
5 ответов

Я понял это. Короткий ответ, я должен был удалить SSH_AUTH_SOCK от update-environment. Так как это было в том списке, значение уносилось далеко каждый раз, когда я повторно прикрепил. Благодаря @djf для подсказки. Существенный бит от tmux (1) страница справочника в update-environment раздел:

Любые переменные, которые не существуют в исходной среде, установлены быть удаленными из среды сессии (как будто-r был дан команде среды набора).

12
27.01.2020, 19:36
  • 1
    @ChrisW. Вы могли быть немного крупные более ясный? Я действительно думаю, что у меня есть та же проблема: иногда агент прекращает работать, когда я повторно прикрепляю tmux сессии. Это имеет некоторый смысл, поскольку соединение SSH является новым и когда я ssh это запустит новый агент. Что я должен изменить, чтобы заставить его работать? Я надеюсь, что это - что-то, что я могу выполнить, поскольку я не хочу должным быть реконфигурировать каждую машину, в которую я являюсь ssh-лугом. - Теперь у меня действительно есть ssh обертка, которая запускает tmux удаленно или восстанавливает существующие соединения, вероятно, я мог сделать что-то прежде, чем восстановить tmux. –  sorin 27.01.2014, 13:17
  • 2
    @ChrisW. короткие ответы иногда хороши, но Вы могли дать длинный ответ? Я борюсь с тем, чтобы заставлять это работать, и ничто в этом сообщении не работает на меня. –  redbmk 07.04.2015, 20:28
  • 3
    @sorin @redbmk Извините за это. Это - единственная строка, которую я должен был изменить в моем .tmux.conf заставить это работать: set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" Вы видите проблемы с ssh или переменные среды в целом? –  Chris W. 31.05.2015, 19:16

Так как я получил Щедрость, я повторно отправлю свой ключевой комментарий для пользы полноты - и постараться не устанавливать посетителей с той же проблемой на ложном пути:

Tmux удалит Переменные среды

Tmux' страница справочника заявляет, что среда обновления удалит переменные, "которые не существуют в исходной среде [...], как будто-r был дан команде среды набора".

По-видимому, это, что вызвало проблему. Посмотрите ответ Chris ниже. Однако я все еще не могу вообразить, как переменная могла отсутствовать в "исходной среде" и все же быть допустимой в недавно созданном tmux окне...


Предыдущий ответ:

Как SSH передающие работы

На удаленной машине смотрите на среду своей оболочки после установления соединения SSH:

user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342

Важный здесь является SSH_AUTH_SOCK, который в настоящее время устанавливается на некоторый файл в/tmp. При исследовании этого файла Вы будете видеть, что это - сокет домена Unix - и подключено к конкретному экземпляру ssh, в котором Вы соединились на. Значительно, это изменяется каждый раз, когда Вы соединяетесь.

Как только Вы выходите из системы, что конкретного файла сокета не стало. Теперь, если Вы пойдете и повторно прикрепите свою tmux сессию, то Вы будете видеть проблему. Это имеет среду от того, когда tmux был первоначально запущен - который, возможно, был несколько недель назад. Тот конкретный сокет давно неисправен.

Решение

Так как мы знаем, что проблема имеет отношение к знанию, где в настоящее время живой сокет аутентификации SSH, позвольте нам просто положить его на предсказуемое место!

В Вашем .bashrc или .zshrc файле на удаленной машине, добавьте следующее:

# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
    rm -f /tmp/ssh-agent-$USER-screen
    ln -sf $SSH_AUTH_SOCK $SOCK
    export SSH_AUTH_SOCK=$SOCK
fi

Я не думаю, что даже необходимо поместить 'команду среды обновления' в tmux.conf. Согласно странице справочника, SSH_AUTH_SOCK уже покрыт по умолчанию.

Кредит

Мой ответ является выборкой этого сообщения в блоге Mark 'xb95' Smith, кто объясняет ту же проблему для экрана.

35
27.01.2020, 19:36
  • 1
    Спасибо за Ваш вдумчивый ответ. Мой вопрос не об установке моего $SSH_AUTH_SOCK в новых оболочках это об установке $SSH_AUTH_SOCK в новых tmux окнах, прежде чем получен .bashrc/.zshrc. –  Chris W. 18.05.2013, 21:24
  • 2
    @ChrisW. Я предположил, что сценарий должен быть помещен в емкостно-резистивный файл Вашей оболочки входа в систему на удаленной машине. Если Вы входите в систему, новая оболочка порождена, SSH_AUTH_SOCK изменен и экспортирован. Когда Вы затем запустите tmux, он наследует SSH_AUTH_SOCK от родительской среды. Так как значение SSH_AUTH_SOCK теперь фиксируется, tmux должен продолжать работать над последующими логинами... Возможно, я неправильно понял проблему –  djf 18.05.2013, 21:55
  • 3
    , я предполагаю, что мой беспорядок о среде, в которой ssh выполняется tmux в контексте нового окна (например. tmux neww ssh somehost). –  Chris W. 18.05.2013, 22:06
  • 4
    Одна проблема с этим подходом, 2-е соединение SSH к машине перезапишет значение SSH_AUTH_SOCK. Этот подход только работает, в то время как tmux заседание открыто через новое соединение SSH. –  phylae 17.11.2015, 06:47

Вместо того, чтобы использовать tmux для обработки моего ssh-агента у меня есть удар, обрабатывают его с:

### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
  else
    start_agent;
fi
### End SSH Agent ### }}}

У меня есть это в моем ~/bashrc, и он работает отлично.

2
27.01.2020, 19:36
  • 1
    $SSH_AUTH_SOCK установлен правильно в моих оболочках, но когда я делаю что-то как tmux neww ssh somehost, Мне предложат мой пароль разблокировать мой закрытый ключ, если я не буду работать tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK. –  Chris W. 14.05.2013, 00:18

объяснение djf приносит другое возможное решение по моему мнению:

Прежде tmux / screen работает:

  1. Авторизоваться.
  2. Запустите экземпляр ssh-agent.
  3. Запустить tmux / screen с переменной (переменными) среды для этого ssh-agent.

Это не могло использовать SSH, передающий клиенту, но относительно этого не попросили.

0
27.01.2020, 19:36
  • 1
    ssh-agent не связывает с TTY, почему должен это быть уничтоженным на выходе из системы(?) — почему использование nohup? Корректный –  poige 19.05.2013, 05:40
  • 2
    @poige. –  Hauke Laging 19.05.2013, 05:52

Я ответил на аналогичный вопрос на StackOverflowhttps://stackoverflow.com/a/49395839/241025. Поскольку эта страница появилась первой в моих поисковых запросах Google, я хотел опубликовать ее сводную версию здесь.

Чтобы каждый сеанс tmux имел набор настраиваемых переменных среды, необходимо добавить значения в -переменные среды сеанса в tmux. Вот пример того, как это сделать.

tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'

Последний шаг явного экспорта FOO необходим для того, чтобы текущая панель получила переменную среды. Любые последующие панели или окна, созданные вами для этого сеанса tmux, будут наследовать FOO, но не будут отображаться в других сеансах.

1
27.01.2020, 19:36

Теги

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