Linux 스크립트에서 다른 사용자로 명령을 실행하는 방법

게시 됨: 2022-07-13
파란색 배경 위에 노트북의 Linux 터미널입니다.
Fatmawati achmad zaenuri/Shutterstock.com

당연히 명령이나 스크립트를 실행할 때 시스템은 사용자가 시작한 프로세스로 이를 실행합니다. 그러나 다른 사용자로 명령과 스크립트를 실행할 수 있습니다.

프로세스에는 소유자가 있습니다.

프로그램이나 스크립트가 실행되면 Linux는 프로세스를 생성합니다. 해당 프로세스에는 소유자가 있습니다. 소유자는 다른 프로세스이거나 사람이 시작한 경우 사용자 계정의 이름입니다.

프로세스의 소유권은 프로세스의 일부 기능과 환경을 정의합니다. 프로세스가 시작된 방법에 따라 상위 프로세스 또는 사용자의 특정 속성을 상속합니다. 또는 더 엄격하게는 사용자가 일반적으로 셸인 프로그램을 시작하는 데 사용한 프로세스입니다.

Linux 터미널에서 프로세스를 관리하는 방법: 알아야 할 10가지 명령
관련 Linux 터미널에서 프로세스를 관리하는 방법: 알아야 할 10가지 명령

다른 사용자로 명령이나 스크립트를 실행하는 것은 프로세스에 의해 생성된 모든 파일의 소유권이 해당 사용자에게 속하기 때문에 유용할 수 있습니다.

sudo 를 사용할 때마다 다른 사용자로 명령을 실행하고 있습니다. sudo 에서 사용하는 기본 사용자 계정은 루트 또는 '수퍼' 사용자입니다. 그 때문에 sudo 는 종종 슈퍼 사용자 do 를 나타내는 것으로 잘못 생각됩니다. 그러나 그것은 느슨한 전문용어일 뿐입니다. 실제로 대체 사용자 do 를 나타냅니다.

sudo 를 사용하면 루트가 아닌 다른 사용자로 명령을 실행할 수 있습니다. 아이러니하게도 그렇게 하려면 루트 권한이 필요합니다. 그러나 다른 사용자가 소유한 프로그램이나 스크립트를 실행하는 것은 해당 프로세스 다른 사용자로 실행하는 것과 동일하지 않습니다. 여전히 루트로 실행합니다.

다음은 실제로 다른 사용자로 프로세스를 실행하는 방법과 다른 사용자가 실행한 것처럼 스크립트 내에서 명령을 실행하는 방법입니다.

다른 사용자로 스크립트 실행

여러 사용자가 구성된 컴퓨터를 사용하고 있습니다. 하나는 사용자 이름이 maryq인 Mary이고 다른 하나는 사용자 이름이 dave인 Dave입니다.

Mary의 홈 디렉토리에는 "other-user.sh"라는 스크립트가 있습니다. 이것은 스크립트의 텍스트입니다.

 #!/bin/bash

echo "스크립트 이름:" $0
echo "작업 디렉토리:" $(pwd)
echo "사용자로 실행 중인 스크립트:" $(whoami)

$0 환경 변수에 보관된 스크립트 이름을 출력합니다. 그런 다음 pwd 를 사용하여 작업 디렉토리를 인쇄합니다. 마지막으로 whoami 명령을 사용하여 스크립트를 시작한 사용자의 이름을 인쇄합니다. 또는 누가 스크립트를 시작 했다고 생각 합니다.

스크립트에서 편집기로 텍스트를 복사하고 다른 사용자 계정의 홈 디렉토리에 "other-user.sh"로 저장합니다.

스크립트를 실행 가능하게 만들어야 합니다. chmod 명령을 사용하고 +x (실행) 옵션과 -u (사용자) 옵션을 사용하여 소유자에 대해서만 실행 플래그를 설정합니다. 이는 Mary만 스크립트를 실행할 수 있음을 의미합니다. ls 를 사용하여 파일 권한을 확인합니다.

 chmod u+x 기타 사용자.sh

사용자 Mary만 실행할 수 있도록 스크립트에 대한 실행 권한 설정

왼쪽에서 오른쪽으로 권한은 다음과 같습니다.

  • 소유자는 파일을 읽고 쓰고 실행할 수 있습니다.
  • 그룹 구성원은 파일을 읽고 쓸 수 있습니다.
  • 다른 사람들은 파일을 읽을 수만 있습니다.

따라서 스크립트를 실행할 수 있는 유일한 사용자는 Mary와 root입니다. Mary가 스크립트를 실행하면 다음과 같은 일이 발생합니다.

 ./기타 사용자.sh 

Mary가 스크립트를 실행할 때의 출력

스크립트의 현재 작업 디렉토리는 Mary의 홈 디렉토리이고 스크립트의 소유자는 사용자 계정 maryq입니다.

예상대로 Dave는 스크립트를 실행할 수 없습니다.

 /home/maryq/other-user.sh 

사용자 Dave는 스크립트를 실행할 수 없으며 권한이 거부되었습니다.

Dave에게 루트 사용자 권한이 있는 경우 sudo 를 사용하여 루트로 스크립트를 실행할 수 있습니다.

 sudo /home/maryq/other-user.sh 

스크립트가 루트에 의해 실행될 때의 출력

이것은 부분적인 성공입니다. 스크립트가 실행되지만 스크립트의 소유자는 maryq가 아니라 root입니다.

우리가 사용해야 할 트릭은 sudo -u (사용자) 옵션입니다. 이렇게 하면 명령을 실행할 사용자를 지정할 수 있습니다. -u 옵션을 사용하지 않으면 sudo 는 기본적으로 루트를 사용합니다. Mary로 명령을 실행하려면 사용자 계정의 이름을 sudo 명령에 전달해야 합니다.

sudo -u maryq /home/maryq/other-user.sh

루트와 함께 -u 사용자 옵션을 사용하여 사용자 Mary로 스크립트 실행

이번에는 스크립트가 프로세스 소유자가 maryq라고 보고합니다.

"other-user.sh" 스크립트에 한 줄을 추가해 보겠습니다. 일부 텍스트를 echo 하고 출력을 "mary.txt"라는 파일로 리디렉션합니다.

 #!/bin/bash

echo "스크립트 이름:" $0 
echo "작업 디렉토리:" $(pwd) 
echo "사용자로 실행 중인 스크립트:" $(whoami)
echo "/home/maryq/에 있는 파일로 이동합니다." > /home/maryq/mary.txt

Mary의 홈 디렉토리에 새 파일을 만들고 있습니다. 스크립트를 Mary로 실행하고 있기 때문에 이것은 완벽합니다.

 ./기타 사용자.sh 

스크립트를 한 번 더 실행하여 텍스트 파일 생성

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

 ls -hl 메리.txt 

스크립트에 의해 생성된 파일의 소유권 확인

이것은 Mary가 실제로 스크립트를 직접 실행한 경우와 동일한 동작입니다.

관련: Linux에서 chmod 명령을 사용하는 방법

runuser 명령

지금까지 스크립트 내에서 사용한 sudo -u 명령을 사용할 수 있지만 스크립트 내에서 다른 사용자로 프로세스를 실행하도록 설계된 또 다른 명령 runuser 가 있습니다. 실행된 프로세스의 반환 코드를 더 잘 처리하고 sudo 보다 오버헤드가 적습니다.

runuser 명령은 루트로 실행해야 하지만 전체 스크립트를 루트로 실행하여 수행할 수 있습니다. 스크립트 내에서 sudo 를 사용할 필요가 없습니다. runuser 명령은 명령줄에서도 사용할 수 있으므로 스크립트용으로 선호되는 방법이지만 스크립트 사용으로 제한되지 않습니다.

Dave는 "mary.txt" 파일을 나열할 수 없습니다. 이 파일은 Mary의 홈 디렉토리에 있고 액세스 권한이 없기 때문입니다.

 고양이 /home/maryq/mary.txt 

사용자 Dave는 Mary의 파일을 읽을 수 없습니다. 권한이 거부되었습니다.

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

 sudo runuser - maryq -c '고양이 mary.txt' 

runuser 명령을 사용하여 Mary의 파일 읽기

명령에는 파일의 전체 경로가 필요하지 않습니다. Mary가 홈 디렉토리를 기준으로 하는 것과 동일한 방식으로 파일을 참조할 수 있습니다.

Dave 사용자로서 다음 텍스트가 포함된 "run-maryq.sh"라는 스크립트를 생성합니다.

 #!/bin/bash

runuser -l maryq -c '고양이 메리.txt'

우리는 그것을 실행 가능하게 만들 것입니다:

 chmod +x run-maryq.sh 

chmod로 스크립트를 실행 가능하게 만들기

실행하려고 할 때 어떤 일이 발생하는지 봅시다.

 ./run-maryq.sh 

일반 사용자로 내부에서 runuser를 사용하여 스크립트 실행

runuser 명령은 일반 사용자가 실행하고 있기 때문에 불평합니다. sudo 로 다시 실행해보자.

 sudo ./run-maryq.sh 

내부에 runuser를 사용하여 루트로 스크립트 실행

그것은 우리가 원하는 대로 작동하며 마치 Mary가 직접 스크립트를 시작한 것처럼 작동합니다.

어느 것을 사용할 것인가?

명령줄에서 선택할 수 있는 항목은 많지 않습니다. 그러나 어쨌든 runuser 와 함께 sudo 를 사용해야 하므로 sudo 를 단독으로 사용할 수도 있습니다.

그러나 스크립트에서는 runuser 가 선호되는 명령입니다.

관련: 초보자를 위한 10가지 기본 Linux 명령