/etc/profile
스크립트를 통해 파일의 특정 줄을 변경하는 명령을 작성하고 있는데 Linux의 일부 버전에서는 명령이 활성화되지 않을 수 있으므로 실행 시 스크립트에서 명령을 사용해야 sudo
합니다 .su
파일에는 /etc/profile
다음 줄이 포함되어 있습니다.
if [ "`id -u`" = "0" ]; then
echo $PATH | grep /usr/local/sbin 1> /dev/null 2> /dev/null
if [ ! $? = 0 ]; then
PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH
fi
fi
그래서 나는 이렇게 했습니다:
$ PROFILE="/etc/profile"
$ sed '/\"`id -u`\"/ s/^if/# if/g;/\"`id -u`\"/ s/$/\nif [[ \"\$(id -u)\" == \"0\" || \"\$(id -un)\" == \"\${HOME##*\/}\" ]]; then/g;' ${PROFILE}
# if [ "`id -u`" = "0" ]; then
if [[ "$(id -u)" == "0" || "$(id -un)" == "${HOME##*/}" ]]; then
echo $PATH | grep /usr/local/sbin 1> /dev/null 2> /dev/null
if [ ! $? = 0 ]; then
PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH
fi
fi
명령은 파일을 변경하기 위해 올바르게 실행되는 것처럼 보이지만 su -c
다음을 사용하여 수행할 때:
$ PROFILE="/etc/profile"
$ su -c "sed '/\"`id -u`\"/ s/^if/# if/g;/\"`id -u`\"/ s/$/\nif [[ \"\$(id -u)\" == \"0\" || \"\$(id -un)\" == \"\${HOME##*\/}\" ]]; then/g;' ${PROFILE}"
if [ "`id -u`" = "0" ]; then
echo $PATH | grep /usr/local/sbin 1> /dev/null 2> /dev/null
if [ ! $? = 0 ]; then
PATH=/usr/local/sbin:/usr/sbin:/sbin:$PATH
fi
fi
비밀번호를 요청하고 변수에 있는 파일을 읽지 $PROFILE
만 행을 수정하지는 않습니다. 명령에 어떤 문제가 있습니까 su -c
?
답변1
알아채다:모든 코드는테스트를 거쳤습니다.Slackware64 15.0 가상 머신에서.
문자 그대로의 대답
@ilkkachu가 지적했듯이 명령의 두 번째 형식에서 (사용수(1)) 큰따옴표 안에 작은따옴표를 사용합니다. 작은따옴표와 큰따옴표다른 규칙을 따르세요;[1] 및 [2]도 참조하세요. 또한 정규식만 필요합니다.
@waltinator가 상기시켰듯이 중요한 수정 파일을 모두 백업해 두어야 합니다./etc/구성 파일예. 암소 비슷한 일종의 영양sed불행히도 이식성이 없는 백업을 생성하는 옵션이 있으므로 -i
대안은 먼저 수정된 파일의 백업 복사본을 만든 다음 해당 백업 복사본에서 작업하고 표준 출력을 새 파일로 리디렉션하는 것입니다.
따라서 명령은 다음과 같아야 합니다.
su -c 'cp /etc/profile /etc/profile.bak; sed "s,^\\(if \\[ \"\`id -u\`\".*\\)\$,\\#\\1\\
if [[ \"\$(id -u)\" == \"0\" || \"\$(id -un)\" == \"\${HOME##*/}\" ]];\
then," /etc/profile.bak > /etc/profile'
그러나 규정을 준수하려면POSIX쉿(1p)(또한: [3]) 다음과 같은 POSIX가 아닌 구문을 피해야 합니다.
if [[ ... == ... || ... == ... ]]; then ...
대신에 다음을 사용할 수 있습니다.
if [ ... = ... ] || [ ... = ... ]; then ...
이와 같이:
su -c 'cp /etc/profile /etc/profile.bak; sed "s,^\\(if \\[ \"\`id -u\`\".*\\)\$,\\#\\1\\
if [ \"\$(id -u)\" = \"0\" ] || [ \"\$(id -un)\" = \"\${HOME##*/}\" ];\
then," /etc/profile.bak > /etc/profile'
실행을 피할 수도 있습니다수완전히 변했다/etc/구성 파일, 파일의 경우/etc/profile.bak이미 존재 함:
if [ ! -f /etc/profile.bak ]; then
su -c 'cp /etc/profile /etc/profile.bak; sed "s,^\\(if \\[ \"\`id -u\`\".*\\)\$,\\#\\1\\
if [ \"\$(id -u)\" = \"0\" ] || [ \"\$(id -un)\" = \"\${HOME##*/}\" ];\
then," /etc/profile.bak > /etc/profile'
fi
대체(올바른) 방법
댓글을 보면 실제로 하고 싶은 일은 사용할 수 있는 사용자 계정을 자동으로 생성하는 것입니다.스도(8)/usr/local/sbin:/usr/sbin:/sbin
이는 중요한 시스템 파일 을 변경 하지 PATH
않고도 쉽게 달성할 수 있습니다./etc/구성 파일.
이렇게 하려면 다음을 수행해야 합니다.
- 루트로 로그인하십시오. 사용자를 자동으로 생성하는 스크립트(예:
createuser
사용자 이름을 첫 번째 매개변수로 받아들이는newuser
)를 생성하는 경우 이를 다음 매개변수에 전달하여 수행할 수 있습니다.스도또는수,예를 들어.su -c 'createuser newuser'
. - (여기부터 끝까지, 아마도 스크립트 내부일 것입니다) 다음을 사용하여 새 사용자 계정을 만듭니다.
useradd -m newuser
newuser
추가하다/etc/sudoers, 그래서 실행될 수 있습니다스도루트 권한을 얻으세요:
printf "newuser ALL=(ALL:ALL) ALL\n" >> /etc/sudoers
스크립트에서는 이것이 약간 다릅니다. 사용자 이름을 변수에 저장한 경우 user
:
printf "%s ALL=(ALL:ALL) ALL\n" "$user" >> /etc/sudoers
/usr/local/sbin:/usr/sbin:/sbin
앞에 붙는PATH
/home/newuser/.profile환경을 맞춤설정하세요.
printf "%s\n" 'export PATH=/usr/local/sbin:/usr/sbin:/sbin${PATH+:}"$PATH"' \
>>/home/newuser/.profile
- 소유권 및 권한 변경/home/newuser/.profile:
chown newuser:newuser /home/newuser/.profile
chmod 644 /home/newuser/.profile
- 비밀번호 설정
newuser
(비밀번호를 변경하려면 tty가 필요함):
passwd newuser
또는 다음과 같이 설정하세요."만료되다", 이는 사용자가 다음에 로그인할 때 강제로 설정하도록 하며 tty가 필요하지 않습니다.
passwd -e newuser
부록
이 두 가지 요구 사항을 결합하여 설정하거나 탈퇴하려는 경우PATH
sudo를 실행하여 생성된 환경 내부, 바라보다sudo
$PATH를 보존하는 방법은 무엇입니까 ?. Slackware64 15.0에서는 기본적으로 위의 "해결 방법"에 있는 단계 외에 추가 단계가 필요하지 않습니다.
newuser@darkstar:~$ sudo sh -c 'printf "%s\n" "$PATH"'
/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/games:/usr/lib64/qt5/bin
인용하다
- POSIX 쉘 명령 언어, (따옴표 2.2개, 작은따옴표 2.2.2개, 큰따옴표 2.2.3개),
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02 - Bash 매뉴얼, 3.1.2 인용문,
https://www.gnu.org/software/bash/manual/html_node/Quoting.html - POSIX 쉘 명령 언어,
https://pubs.opengroup.org/onlinepubs/9699919799/idx/shell.html