su 명령과 함께 이 스크립트 I/O 리디렉션을 사용하십시오.

su 명령과 함께 이 스크립트 I/O 리디렉션을 사용하십시오.

이것은 내 스크립트입니다. 다른 사용자로 로그인하여 다음을 수행하고 싶습니다 ls -lih.

#!/bin/bash

su - testuser <<- _EOF_
    123456 #password
    _EOF_

ls -lih

스크립트를 실행할 때의 출력은 다음과 같습니다.

./script.sh
-bash: line 1: 123456: command not found
total 127M
 262210 drwxr-xr-x.  9 mazimi mazimi 156K Feb 14 19:05 Desktop
 262211 drwxr-xr-x.  2 mazimi mazimi  36K Feb 14 18:26 Downloads
 278106 -rw-r--r--   1 mazimi mazimi  64K Feb 14 22:30 ems.cfg
 ... # list of files

내 홈 디렉토리에 있지 ls -lih않나요 testuser? 어떻게 고쳐야 합니까?

답변1

코드에 몇 가지 문제가 있습니다.

  1. su비밀번호는 에서 읽는 것이 /dev/tty아니라 에서 읽어 stdin오므로 이와 같이 비밀번호를 리디렉션할 수 없습니다. 실제로 su기본값은 대상 사용자로 셸을 시작하는 것이므로 다음 명령을 실행하면 다음과 같습니다 root.

    su - testuser <<- _EOF_
    123456 #password
    _EOF_
    

    성공할 것입니다 su(루트는 이 작업을 수행하기 위해 비밀번호가 필요하지 않습니다). 하지만 123456사용자 쉘에 입력으로 전달됩니다. 따라서 스크립트를 실행할 때 다음과 같은 내용이 표시됩니다.

    -bash: line 1: 123456: command not found
    

    루트가 아닌 사용자로 이 작업을 수행하려면 bahamt의 조언을 따르고 sudo다른 사용자가 특정 명령에 암호 없이 액세스할 수 있도록 구성할 수 있는 를 사용해야 합니다.

  2. 작동 하더라도 su새로운 프로세스가 생성됩니다. 명령이 실행되기 전에 su명령이 종료되고 원래 계정으로 반환되었습니다 ls. 그래서 당신이 정말로 원하는 것은 :

    su - testuser <<EOF
    ls -lih
    EOF
    

답변2

내 생각엔 당신이 그것을 고칠 수 없다는 것을 알게 될 것 같아요. 내 생각엔 비밀번호가 su읽혀진 것 같은데 /dev/tty, 실제로 해당 마법 장치 파일로 리디렉션할 수는 없다고 생각합니다.

Linux를 사용하는 경우 su읽기 콘텐츠를 사용하여 비밀번호를 확인할 수 있습니다 strace.

답변3

당신이 정말로 사용하고 싶은 것은 입니다 sudo.

당신은 시작하고 싶을 수도 있습니다여기.

관련 정보