$HOME
su를 통해 사용자 변수를 얻으 려고합니다 .
솔라리스
# su oracle
$ echo $HOME
/root
AIX
# su oracle
$ echo $HOME
/
리눅스
# su oracle
$ echo $HOME
/home/oracle
Solaris 및 AIX에서 $HOME
변수를 얻으려고 할 때 루트를 얻는 이유를 누군가 설명할 수 있습니까 $HOME
?
고쳐 쓰다
-
with 또는 login을 사용하면 작동하지만 스크립트에서 작동하도록 -l
할 수 없습니다 . su -
이 문제를 극복하는 방법에 대한 아이디어가 있습니까?
위의 해결 방법을 사용하지 않으려고 했지만 선택의 여지가 없었습니다.
cat /etc/passwd | grep oracle | cut -d: -f 6
또는 Thomas가 제안한 것처럼:
cat /etc/passwd | awk -F: '$1 ~ /^'oracle'$/ {print $6;}'
답변1
실제로 (빠른 확인) su
Solaris에서는 (권한이 없는 사용자에서 권한이 없는 다른 사용자로) 전혀 수정이 없습니다 $HOME
. 아마도 너는뿌리명령을 내릴 때 su
.
Solaris 매뉴얼 페이지에는 이 문제가 언급되어 있지 않지만 다음에서 인용된 알려진 문제입니다.뉴스그룹 댓글:
nails September 16, 2008 at 18:16:45
jefro:
Sorry I must disagree wtih you. At least in Solaris su <user id>
doesn't change the user environment - including environmental
variables. To change the environment, you must execute
su - <user id>
According to the su MAN page:
If the first argument to su is a dash (-), the environment will
be changed to what would be expected if the user actually logged
in as the specified user.
그러나 매뉴얼 페이지에는 여러 변수에 대한 내용이 나와 있지만 다음과 같은 내용은 나와 있지 않습니다 HOME
.
o In addition to what is already propagated, the LC* and
LANG environment variables from the specified user's
environment are also propagated.
o Propagate TZ from the user's environment. If TZ is not
found in the user's environment, su uses the TZ value
from the TIMEZONE parameter found in
/etc/default/login.
o Set MAIL to /var/mail/new_user.
If the first argument to su is a dash (-), the environment
will be changed to what would be expected if the user actu-
ally logged in as the specified user. Otherwise, the
environment is passed along, with the exception of $PATH,
which is controlled by PATH and SUPATH in /etc/default/su.
마지막 문장은 현재 사용자의 HOME
변수가 변경되지 않고 전달된다는 의미로 해석될 수 있습니다( su -
물론 "" 형식을 사용하지 않는 한).
기타 시스템:
- AIX매뉴얼 페이지별로 도움이 되지는 않지만 두 기능 모두 오래된 기능이므로 동작은 아마도 동일한 소스 코드를 기반으로 할 것입니다.
- 고성능 사용자 경험 시스템매뉴얼 페이지"이전에 정의된"이라고 말하는 것도 도움이 되지 않습니다.
HOME
그리고ENV
환경 변수는삭제됨".
su
필요한 정보가 제공되지 않으므로 다른 접근 방식이 도움이 될 것입니다 . 귀하의 계정이 모두 로컬(LDAP 없음)인 경우 언제든지 를 검색할 수 있습니다 /etc/passwd
.
THATHOME=$( awk -F: '$1 ~ /^'$THATUSER'$/ {print $6;}' </etc/passwd )
노트:
- 형식은
/etc/passwd
모든 Unix 계열 시스템에서 동일합니다. - 필드를 여러 필드로 분할 하면
awk
예를 들어 account 가 있는 경우 grep이 잘못된 행을 선택하는 문제를 피할 수 있습니다oracleadmin
. getent
LDAP가 있는 경우 로컬이 아닌 사용자 참조를 허용하는 유틸리티가 있을 수 있습니다.
답변2
이것은 정말 간단하지만 흔히 오해를 불러일으키는 원인입니다. 너무 흔해서위키피디아 항목:
용법
명령줄에서 실행할 때 su는 대상 사용자의 비밀번호를 묻고, 인증된 경우 운영자에게 해당 계정과 해당 계정이 액세스할 수 있는 파일 및 디렉터리에 대한 액세스 권한을 부여합니다.
john@localhost:~$ su jane Password: jane@localhost:/home/john$ exit logout john@localhost:~$
하이픈(su -)과 함께 사용하면 로그인 쉘을 시작하는 데 사용할 수 있습니다. 이 모드에서 사용자는 대상 사용자의 사용자 환경을 가정할 수 있습니다.:
john@localhost:~$ su - jane Password: jane@localhost:~$
사용자 환경에서 명령을 실행하려면 다음을 수행하십시오.
su - user -c "command [args]"