
당연히 명령이나 스크립트를 실행할 때 시스템은 사용자가 시작한 프로세스로 이를 실행합니다. 그러나 다른 사용자로 명령과 스크립트를 실행할 수 있습니다.
프로세스에는 소유자가 있습니다.
프로그램이나 스크립트가 실행되면 Linux는 프로세스를 생성합니다. 해당 프로세스에는 소유자가 있습니다. 소유자는 다른 프로세스이거나 사람이 시작한 경우 사용자 계정의 이름입니다.
프로세스의 소유권은 프로세스의 일부 기능과 환경을 정의합니다. 프로세스가 시작된 방법에 따라 상위 프로세스 또는 사용자의 특정 속성을 상속합니다. 또는 더 엄격하게는 사용자가 일반적으로 셸인 프로그램을 시작하는 데 사용한 프로세스입니다.
다른 사용자로 명령이나 스크립트를 실행하는 것은 프로세스에 의해 생성된 모든 파일의 소유권이 해당 사용자에게 속하기 때문에 유용할 수 있습니다.
우리가 사용할 때마다 sudo 우리는 다른 사용자로 명령을 실행하고 있습니다. 에서 사용하는 기본 사용자 계정 sudo 루트 또는 ‘수퍼’ 사용자입니다. 그것 덕분에, sudo 를 나타내는 것으로 종종 잘못 생각됩니다. 슈퍼 유저. 그러나 그것은 느슨한 전문용어일 뿐입니다. 그것은 실제로 대체 사용자 할.
와 함께 sudo , 루트가 아닌 다른 사용자로 명령을 실행할 수 있습니다. 아이러니하게도 그렇게 하려면 루트 권한이 필요합니다. 그러나 다른 사용자가 소유한 프로그램이나 스크립트를 실행하는 것은 해당 프로세스를 실행하는 것과 동일하지 않습니다. ~처럼 그 다른 사용자. 여전히 루트로 실행하고 있을 것입니다.
다음은 실제로 다른 사용자로 프로세스를 실행하는 방법과 다른 사용자가 실행한 것처럼 스크립트 내에서 명령을 실행하는 방법입니다.
다른 사용자로 스크립트 실행
여러 사용자가 구성된 컴퓨터를 사용하고 있습니다. 하나는 사용자 이름이 maryq인 Mary이고 다른 하나는 사용자 이름이 dave인 Dave입니다.
Mary의 홈 디렉토리에는 “other-user.sh”라는 스크립트가 있습니다. 이것은 스크립트의 텍스트입니다.
#!/bin/bash echo "Script name:" $0 echo "Working directory:" $(pwd) echo "Script running as user:" $(whoami)
에 보관된 스크립트 이름을 출력합니다. $0 환경 변수. 그런 다음 사용합니다. pwd 작업 디렉토리를 인쇄합니다. 마지막으로, 그것은 사용 whoami 스크립트를 시작한 사용자의 이름을 인쇄하는 명령입니다. 아니면 누구 생각 스크립트를 시작했습니다.
스크립트에서 편집기로 텍스트를 복사하고 다른 사용자 계정의 홈 디렉토리에 “other-user.sh”로 저장합니다.
스크립트를 실행 가능하게 만들어야 합니다. 우리는 사용할 것입니다 chmod 명령하고 사용 +x (실행) 옵션 및 -u (user) 옵션은 소유자에 대해서만 실행 플래그를 설정합니다. 이는 Mary만 스크립트를 실행할 수 있음을 의미합니다. 우리는 다음을 사용하여 파일 권한을 확인할 것입니다. ls .
chmod u+x other-user.sh
ls

왼쪽에서 오른쪽으로 권한은 다음과 같습니다.
- 소유자는 파일을 읽고 쓰고 실행할 수 있습니다.
- 그룹 구성원은 파일을 읽고 쓸 수 있습니다.
- 다른 사람들은 파일을 읽을 수만 있습니다.
따라서 스크립트를 실행할 수 있는 유일한 사용자는 Mary와 root입니다. Mary가 스크립트를 실행하면 다음과 같은 일이 발생합니다.
./other-user.sh

스크립트의 현재 작업 디렉토리는 Mary의 홈 디렉토리이고 스크립트의 소유자는 사용자 계정 maryq입니다.
예상대로 Dave는 스크립트를 실행할 수 없습니다.
/home/maryq/other-user.sh

Dave에 루트 사용자 권한이 있는 경우 다음을 사용하여 루트로 스크립트를 실행할 수 있습니다. sudo .
sudo /home/maryq/other-user.sh

이것은 부분적인 성공입니다. 스크립트가 실행되지만 스크립트의 소유자는 maryq가 아니라 root입니다.
우리가 사용해야 할 트릭은 sudo -u (사용자) 옵션. 이렇게 하면 명령을 실행할 사용자를 지정할 수 있습니다. 사용하지 않는 경우 -u 옵션, sudo 기본적으로 루트를 사용합니다. Mary로 명령을 실행하려면 사용자 계정의 이름을 sudo 명령.
sudo -u maryq /home/maryq/other-user.sh

이번에는 스크립트가 프로세스 소유자가 maryq라고 보고합니다.
“other-user.sh” 스크립트에 한 줄을 추가해 보겠습니다. 잘 echo 일부 텍스트를 입력하고 출력을 “mary.txt”라는 파일로 리디렉션합니다.
#!/bin/bash echo "Script name:" $0 echo "Working directory:" $(pwd) echo "Script running as user:" $(whoami) echo "This is going into a file in /home/maryq/" > /home/maryq/mary.txt
Mary의 홈 디렉토리에 새 파일을 만들고 있습니다. 스크립트를 Mary로 실행하고 있기 때문에 이것은 완벽합니다.
./other-user.sh

Mary의 홈 디렉토리를 확인하면 파일이 생성되었으며 파일의 소유권은 maryq 사용자 계정에 속해 있음을 알 수 있습니다.
ls -hl mary.txt

이것은 Mary가 실제로 스크립트를 직접 실행한 경우와 동일한 동작입니다.
관련된: Linux에서 chmod 명령을 사용하는 방법
runuser 명령
당신은 사용할 수 있습니다 sudo -u 지금까지 스크립트 내에서 사용한 명령이지만 다른 명령이 있습니다. runuser, 이는 내부 스크립트와 다른 사용자로 프로세스를 실행하도록 설계되었습니다. 실행된 프로세스에서 반환 코드를 더 잘 처리하고 오버헤드가 더 적습니다. sudo.
그만큼 runuser 명령은 루트로 실행해야 하지만 전체 스크립트를 루트로 실행하여 수행할 수 있습니다. 사용할 필요가 없습니다 sudo 스크립트 내부. 그만큼 runuser 명령은 명령줄에서도 사용할 수 있으므로 스크립트에서 선호하는 방법이지만 스크립트 사용에 국한되지 않습니다.
Dave는 “mary.txt” 파일을 나열할 수 없습니다. 이 파일은 Mary의 홈 디렉토리에 있고 액세스 권한이 없기 때문입니다.
cat /home/maryq/mary.txt

다음을 사용하여 파일 내부를 엿볼 수 있습니다. runuser, 하지만. 그만큼 - (login) 옵션은 Mary가 실제로 로그인했다면 했을 셸 환경과 매우 유사한 환경에서 새 셸을 시작합니다. -c (command) 옵션 다음에 실행하려는 명령이 옵니다.
sudo runuser - maryq -c 'cat mary.txt'

명령에는 파일의 전체 경로가 필요하지 않습니다. Mary가 홈 디렉토리를 기준으로 하는 것과 동일한 방식으로 파일을 참조할 수 있습니다.
Dave 사용자로서 다음 텍스트가 포함된 “run-maryq.sh”라는 스크립트를 생성합니다.
#!/bin/bash runuser -l maryq -c 'cat mary.txt'
우리는 그것을 실행 가능하게 만들 것입니다:
chmod +x run-maryq.sh

실행하려고 할 때 어떤 일이 발생하는지 봅시다.
./run-maryq.sh

그만큼 runuser 명령은 일반 사용자가 실행하고 있기 때문에 불평합니다. 로 다시 실행해보자 sudo.
sudo ./run-maryq.sh

그것은 우리가 원하는 대로 작동하며 마치 Mary가 직접 스크립트를 시작한 것처럼 작동합니다.
어느 것을 사용할 것인가?
명령줄에서 선택할 수 있는 항목은 많지 않습니다. 그러나 당신이 사용해야 하는 것처럼 sudo ~와 함께 runuser 어쨌든, 당신은 잘 사용할 수 있습니다 sudo 자체적으로.
그러나 스크립트에서, runuser 선호하는 명령입니다.
관련된: 초보자를 위한 10가지 기본 Linux 명령








