Очевидно, это связано с буферизацией, которую grep
делает для ускорения работы . Существуют инструменты, специально разработанные для чтения любого количества символов, но не более. Один из них - expect
:
{ expect -c "log_user 0; expect 2"; cat; } < infile
У меня нет системы, чтобы попробовать это, но я считаю, что ожидаю, что
съест все, пока не встретит ожидаемую строку ( 2
), а затем завершить, оставив остальную часть ввода для cat
.
Вы, безусловно, можете сделать следующее для всех пользователей или для данного пользователя колебаться,
однако это применимо ко всем командам sudo - u anyuser
. Отредактируйте файл / etc / sudoers
и добавьте строку типа
Defaults env_keep+="PATH JAVA_HOME"
для всех пользователей или
Defaults:wobble env_keep+="PATH JAVA_HOME"
для просто колебания со всеми переменными, которые вы хотите сохранить. На самом деле, PATH
обычно является особым случаем и сбрасывается, поэтому вам может потребоваться отменить его с помощью записи типа
Defaults:wobble !secure_path, env_keep+="PATH JAVA_HOME"
. Очевидно, что эти функции существуют не зря, так что будьте осторожны.
Существует также возможность сохранить среду с помощью sudo -E
, что может быть разрешено записью sudoers, например:
wobble ALL = (wibble) SETENV: ALL
, но это все равно сбросит специальный случай PATH, хотя вы можете запускать команды например
sudo -E PATH=$PATH -u wibble ...
Вы можете использовать sudo -i
, чтобы пройти все процессы входа в систему для пользователя, поэтому sudo -i -u команда wibble
войдет в систему как wibble, установит все ее переменные среды и запустите команду от имени этого пользователя.
Однако sudo -i -u wibble echo $ HOME
все равно распечатает ваш домашний путь. Это связано с тем, что ваше приглашение расширяет переменную $ HOME еще до запуска sudo, и sudo ничего не может с этим поделать. Поэтому, если вам нужно передать переменную среды через командную строку, она должна быть экранирована должным образом, вот несколько примеров:
sudo echo $HOME
> /home/user
sudo -i echo '$HOME'
> /root
sudo echo '$HOME'
> $HOME
sudo bash -c 'echo $HOME'
> /root
sudo -i bash -c 'echo $HOME'
> /root
Ко всему этому вы можете добавить -u wibble
(перед командой) в вместо этого запустите их как wibble.
Думаю, вы ищете
sudo su - USER
Это запустит оболочку только с ПОЛЬЗОВАТЕЛЯМИ переменными окружения(SUDO_USER
и т. д.):
-, -l, --login
Start the shell as a login shell with an environment similar to a real login