일부 매개변수를 허용하고 다른 사용자로 실행하는 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
대신 을 사용하므로 이 문제 없이 매개변수를 올바르게 전달하는 것이 매우 어렵습니다 .su
su
sudo
단지 작은 코드 조각을 실행하려는 경우 다음을 수행할 수도 있습니다.
target_user="foo"
sudo -u "$target_user" sh -s "$@" <<'EOF'
echo "$@"
EOF
그러면 가 시작되고 sh
현재 스크립트의 매개변수가 전달된 다음 heredoc을 통해 제공된 스크립트가 실행됩니다.
답변2
EOF
따옴표 안에 넣으면 쉘의 해석을 echo $1
위해 "여기 문서"( ) 를 효과적으로 참조할 수 있습니다 . 그러나 쉘에는 위치 매개변수가 없습니다. 지금은 테스트할 수 없지만 다음과 같은 몇 가지 사항이 작동할 수 있습니다.$1
user2
인용하지 마십시오
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 공유 플랫폼