su 명령 오류

su 명령 오류

/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/구성 파일.

이렇게 하려면 다음을 수행해야 합니다.

  1. 루트로 로그인하십시오. 사용자를 자동으로 생성하는 스크립트(예: createuser사용자 이름을 첫 번째 매개변수로 받아들이는 newuser)를 생성하는 경우 이를 다음 매개변수에 전달하여 수행할 수 있습니다.스도또는,예를 들어. su -c 'createuser newuser'.
  2. (여기부터 끝까지, 아마도 스크립트 내부일 것입니다) 다음을 사용하여 새 사용자 계정을 만듭니다.
useradd -m newuser
  1. newuser추가하다/etc/sudoers, 그래서 실행될 수 있습니다스도루트 권한을 얻으세요:
printf "newuser  ALL=(ALL:ALL) ALL\n" >> /etc/sudoers

스크립트에서는 이것이 약간 다릅니다. 사용자 이름을 변수에 저장한 경우 user:

printf "%s  ALL=(ALL:ALL) ALL\n" "$user" >> /etc/sudoers
  1. /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
  1. 소유권 및 권한 변경/home/newuser/.profile:
chown newuser:newuser /home/newuser/.profile
chmod 644 /home/newuser/.profile
  1. 비밀번호 설정 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

인용하다

  1. POSIX 쉘 명령 언어, (따옴표 2.2개, 작은따옴표 2.2.2개, 큰따옴표 2.2.3개),
    https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_02
  2. Bash 매뉴얼, 3.1.2 인용문,
    https://www.gnu.org/software/bash/manual/html_node/Quoting.html
  3. POSIX 쉘 명령 언어,
    https://pubs.opengroup.org/onlinepubs/9699919799/idx/shell.html

관련 정보