다른 사용자가 실행하는 명령에 인수 전달

다른 사용자가 실행하는 명령에 인수 전달

일부 매개변수를 허용하고 다른 사용자로 실행하는 bash 스크립트가 있습니다.test.sh

#!/bin/bash
sudo su user2 <<'EOF'
echo $1
EOF

그러나 공백으로 인쇄됩니다.

$ ./test.sh haha

환경변수가 재설정(?)되었기 때문인 것으로 알고 있습니다. 이 주장을 어떻게 전달할 수 있습니까? 보안 측면에서 환경 재설정을 비활성화하면 안 된다고 들었습니다. 이 문제를 해결하기 위해 제가 생각할 수 있는 유일한 방법은 $1파일에 쓴 다음 user2가 다시 읽는 것입니다. 하지만 더 좋은 방법이 있어야 한다고 생각합니다.

답변1

전체 스크립트를 다른 사용자로 실행하려면 일반적인 접근 방식은 스크립트 맨 위에 다음과 유사한 내용을 추가하는 것입니다.

target_user="foo"
if [ "$(whoami)" != "$target_user" ]; then
  exec sudo -u "$target_user" -- "$0" "$@"
fi

여기서는 . sudo대신 을 사용하므로 이 문제 없이 매개변수를 올바르게 전달하는 것이 매우 어렵습니다 .sususudo

단지 작은 코드 조각을 실행하려는 경우 다음을 수행할 수도 있습니다.

target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
  echo "$@"
EOF

그러면 가 시작되고 sh현재 스크립트의 매개변수가 전달된 다음 heredoc을 통해 제공된 스크립트가 실행됩니다.

답변2

EOF따옴표 안에 넣으면 쉘의 해석을 echo $1위해 "여기 문서"( ) 를 효과적으로 참조할 수 있습니다 . 그러나 쉘에는 위치 매개변수가 없습니다. 지금은 테스트할 수 없지만 다음과 같은 몇 가지 사항이 작동할 수 있습니다.$1user2

  • 인용하지 마십시오 EOF:

    sudo su user2 << EOF
    echo $1
    EOF
    
  • 환경을 통해 값 전달:

    export my_val="$1"
    sudo su user2 << 'EOF'
    echo "$my_val"
    EOF
    

답변3

이것은 효과가 있을 수 있습니다:

#!/bin/bash
su - user2 -c 'echo "$0" "$@"' -- "$@"

큰따옴표를 이스케이프 처리할 필요가 없도록 간단한 따옴표를 사용하여 '명령 인수를 전달하세요 .su"

인용하다:

su -c에서 사용할 bash 함수 매개변수를 이스케이프하세요.

bash - su가 제공하는 쉘에 매개변수 전달 - Think Tank 101 - CC copyright 기반 Q&A 공유 플랫폼

관련 정보