상위 셸로 돌아가지 않고 다른 사용자로 명령을 사용하여 bash 하위 셸을 실행합니다.

상위 셸로 돌아가지 않고 다른 사용자로 명령을 사용하여 bash 하위 셸을 실행합니다.

내 추구의 일환으로루트가 아닌 사용자로 전환할 때 bashrc 및 vimrc 유지, 나는 다른 사용자로 전환하기 위해 매우 추악한 별칭을 만들고 즉시 일부 명령을 실행한 다음 프롬프트에서 나를 삭제할 계획입니다.

("super") 셸로 즉시 돌아가지 않고 초기 명령을 사용하여 대화형 bash 하위 셸을 실행합니다.내 질문에 대답하지 않는 것 같습니다. bash --init-file <(echo "ls; pwd; a=7")예상대로 작동하지만 sudo bash --init-file <(echo "ls; pwd; a=7")아무것도 반환하지 않습니다. echo $aOR에서 터미널로 아무 것도 인쇄되지 않습니다.lspwd

첫 번째 명령은 작동하지만 두 번째 명령은 작동하지 않는 이유는 무엇입니까? 환경 변수를 지속적으로 변경한 다음 해당 쉘에 액세스하는 다른 사용자의 쉘에서 명령을 실행하는 bash 명령을 어떻게 만들 수 있습니까? 이는 이미 루트가 아닌 다른 사용자로 전환하는 데 더 적합합니다.루트에 대한 다양한 솔루션.

답변1

% echo <(echo "ls; pwd; a=7")
/proc/self/fd/11
% bash
$ echo <(echo "ls; pwd; a=7")
/dev/fd/63

따라서 <(...)양식은 실제로 다른 프로세스에서 사용할 수 없는 셸별 파일 설명자에 대한 경로입니다. 특히 하나는 bash실제로 파이프입니다.

$ function hmm() { ls -al $1; }
$ hmm <(echo pwd)
lr-x------ 1 jhqdoe jhqdoe 64 Aug 21 14:58 /dev/fd/63 -> pipe:[910134]

sudo보안상의 이유로 기본적으로 이러한 파일 설명자를 모두 닫으려고 노력하고 있습니다( --close-from옵션 설명서 참조 sudo(8)). 그때쯤에는 이러한 파일 설명자 중 하나를 변경할 수 있습니다(보안 정책에서 허용하고 위험을 감수할 수 있는 경우 closefrom_override) --close-from.

또 다른 방법은 일부 명령을 실행한 후 이를 사용 expect하고 사용자에게 전달하는 것입니다.

#!/usr/bin/env expect
spawn -noecho bash
expect -ex {$}
send "pwd\r"
expect -ex {$}
interact

관련 정보