Переменная окружения с пробелами в строке - Как их использовать из /proc/pid/environment
Я установил переменную с пробелами в строке для нового bash:
VAR='my variable with spaces' /bin/bash
И теперь, если я хочу запустить новый bash в той же среде, я бы сделал что-то вроде:
ENV=$(cat /proc/self/environ | xargs -0 | grep =)
env -i - $ENV /bin/bash
Но дело в том, что в /proc/self/environ
эта переменная без кавычек. Итак, последняя команда выдает: env: variable: No such file or directory
Как я могу обойти это ограничение?
PS: это упрощенная версия следующего выпуска: https://github.com/jpetazzo/nsenter/issues/62
2 ответа
Я думаю, что ответ здесь заключается в том, чтобы не использовать сценарий оболочки для настройки. Использование языка более высокого уровня упрощает анализ /proc/<PID>/environ
во что-то полезное. Вот короткий пример:
#!/usr/bin/python
import os
import sys
import argparse
def parse_args():
p = argparse.ArgumentParser()
p.add_argument('pid')
p.add_argument('command', nargs=argparse.REMAINDER)
return p.parse_args()
def main():
args = parse_args()
env = {}
with open('/proc/%s/environ' % args.pid) as fd:
for envspec in fd.read().split('\000'):
if not envspec:
continue
varname, varval = envspec.split('=', 1)
env[varname] = varval
print env
os.execvpe(args.command[0], args.command, env)
if __name__ == '__main__':
main()
Поместите это в файл с именем env-from
, сделайте его исполняемым, и тогда вы можете запустить:
env-from <pid> bash
И вы получите оболочку, используя переменные окружения из указанного процесса.
Просто добавь
-L1
к
xargs
(максимальное количество непустых строк ввода на командную строку):
xargs -0 -L1 -a /proc/self/environ
Это даст вам каждую переменную в отдельной строке, что упростит обработку.