Можно ли передавать переменные среды от дочернего элемента к родительскому в пространстве пользователя? [дубликат]

Если вы используете seahorse в качестве менеджера паролей ... Что вы, вероятно, и есть; D

Другое решение, которое достигает цели, которую вы ищете, - это просто добавить ssh-ключи в seahorse для автоматической разблокировки при входе в систему . Основным преимуществом этого является то, что вам никогда не нужно вводить пароль для ключей после входа в систему через gdm или что-то еще, с чем вы входите, даже если у ключей есть пароль. Для этого ТРЕБУЕТСЯ как закрытый, так и открытый ключ. Они также ДОЛЖНЫ следовать соглашению об именах для морских коньков. Допускается значение по умолчанию (id_rsa для закрытого ключа и id_rsa.pub для открытого ключа ... На самом деле все, что есть privatekeyname и privatekeyname.pub )

Чтобы добавить ваш ssh-ключ в морской конек для автоматической разблокировки при входе в систему; (на fedora25 я не уверен, где путь находится в других дистрибутивах, хотя, скорее всего, он очень похож)

/lib64/seahorse/seahorse-ssh-askpass /path/to/keys/here

Для меня это было

/lib64/seahorse/seahorse-ssh-askpass ~/.ssh/id_rsa

(морской конек автоматически Предположим, что открытый ключ в моем случае был id_rsa.pub)

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

Морской конек не подскажет, все ли прошло хорошо. Вам нужно будет попытаться подключиться к целевой машине по ssh.Затем морской конек предложит вам разблокировать ключ с помощью пароля графически (ЭТО ПРОИЗОЙДЕТ ТОЛЬКО ОДИН РАЗ), но на этот раз он должен выглядеть немного по-другому; P (это также та часть, где морской конек делает некоторые морские коньки для магии ssh-add, я считаю ) и предложите ВАРИАНТ для разблокировки ключа при входе в систему, вы должны отметить эту опцию, чтобы достичь своей цели.

Просто потому, что я не прочитал все ответы, я бы порекомендовал отменить то, что все говорили вам делать с помощью ssh-add, прежде чем пытаться ответить. В противном случае с вашими ключами может случиться что-то плохое, idk.

7
22.06.2017, 17:37
3 ответа

Вы можете передавать значения переменных от дочернего процесса к его родительскому процессу через файл или именованный канал.

Вот теоретический простейший пример:

дочерний процесс:

echo ${variable} >/tmp/file

родительский процесс:

read variable </tmp/file
5
27.01.2020, 20:15

Нет, это невозможно.

Переменные среды могут передаваться от родительской к дочерней только (как часть экспорта/наследования среды ), а не наоборот.

16
27.01.2020, 20:15

Это очень сложно если родительский процесс не ожидает и не сотрудничает с ним. В этом случае см. изменение среды запущенного процесса и Есть ли способ изменить переменные окружения другого процесса?

Если родительский процесс ожидает значение и сотрудничество с передачей, простой способ — использовать подстановку команд:

export VAR=$(cmd)

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

exec 3>&1       # Copy our file descriptor 1 into file descriptor 3.
                # child_prog will be invoked with file descriptor 1 pointing to a pipe
                # for the command substitution, but all other file descriptors intact.
                # Specifically, fd3 will point to our stdout.
export var=$(child_prog)
exec 3>&-       # (Optionally) close fd3 as cleanup.

Теперь, если child_progкоротко и просто, проще всего просто написать значение переменной в файловый дескриптор 1 и используйте файловый дескриптор 3(cmd >&3)в качестве стандартного вывода. Если он большой и/или сложный, вы можете сделать что-то вроде:

exec 5>&1       # Redirect fd1 (the command substitution pipe) to fd5.
exec 1>&3       # Set our fd1 (stdout) to our parent's stdout (which was passed in as fd3).
exec 3>&-       # Close fd3; it’s no longer needed.

, а затем обычно используйте стандартный вывод и используйте >&5для записи значения.

До сих пор я предполагал, что вы хотите передать только одно значение одной переменной. Если у вас есть несколько значений, достаточно просто разграничить их символом (или строкой ). это гарантированно не появится ни в одном из значений. Если мы выберем @@, то родитель может сказать

exec 3>&1
temp=$(child_prog)
exec 3>&-
export var1="${temp%%@@*}"
rest="${temp#*@@}"
export var2="${rest%%@@*}"
export var3="${rest#*@@}"

и ребенок может сказать echo "value1@@value2@@value3" >&5.

Если трудно найти строку печатных символов это гарантированно не появится ни в одном из значений, вы можете использовать новую строку. Просто измените @@на новую строку в приведенных выше командах:

Родитель:

export var1="${temp%%
*}"
rest="${temp#*
}"
export var2="${rest%%
*}"
export var3="${rest#*
}"

Ребенок:

printf "%s\n" "value1" "value2" "value3" >&5

Еще один вариант заключается в том, чтобы дочерний канал команд обратно к родителю, а не к значениям. Если родитель говорит . <(child_prog), он запускает дочерний процесс, фиксирует вывод и выполняет его . Тогда ребенок может сделать

printf "export var1='value1'\nexport var2='value2' var3=\"value3\"\n" >&5

(Я проверил это с value3, который содержал апостроф, поэтому мне пришлось процитировать его с \"…\", и я оставил его таким, чтобы проиллюстрировать альтернативный синтаксис.)

Особенностью этого метода является то, что вы можете добавить переменную (s )для экспорта без изменения кода в родительском.

Этот подход требует, чтобы родительский процесс выполнял bash. (или, может быть, один из других продвинутых снарядов? ), поскольку POSIX не поддерживает <(cmd).

5
27.01.2020, 20:15

Теги

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