[英]Python expand user doesn't work over su on Solaris and AIX
我的脚本需要以root
身份执行,对于某些任务,如someuser
,我还需要获取someuser
$HOME
路径,这就是问题所在。
对于该工作(查找用户主目录),我正在使用os.path.expanduser
。
如前所述,脚本需要使用su
更改其用户并运行代码以使用户返回首页:
from os.path import expanduser
def user_home():
home = expanduser("~")
return home
print user_home()
主脚本使用su
调用test_home.py :
# su someuser -c /tmp/test_home.py
/home/someuser
很好。 但是对于AIX和Solaris,该脚本不会获取someuser
$HOME
,而是获取root
$HOME
。
AIX :以root用户身份执行
su someuser -c /tmp/test_home.py
/
Solaris :以root用户身份执行
su someuser -c /tmp/test_home.py
shell-init: error retrieving current directory: getcwd: cannot access parent directories: Permission denied
/root
我已经在多个发行版上测试了此代码:
问题仅在AIX和Solaris上。 有谁知道为什么?
在-
或-l
使用login可以正常工作,但是我不能在脚本上使用su -
。 关于如何克服这一点的任何想法?
我试图不使用像上面这样的shell方法,但是我没有选择了
cat /etc/passwd | grep someuser | cut -d: -f 6
在使用sudo或su之后,我遇到了同样的问题,它给出了根主目录,我通过以下方式进行了修复:
akjha-mn2:~ akjha$ python test1
/Users/akjha
akjha-mn2:~ akjha$ sudo python test1
Password:
/Users/akjha
akjha-mn2:~ akjha$ cat test1
#!/bin/env python
import os
user1=os.getlogin()
home=os.path.expanduser("~{0}".format(user1))
print home
akjha-mn2:~ akjha$
import socket
import os
import time
import sys
import pwd
###############################################################################
# Set uid and gid
###############################################################################
def set_uid_gid( uid, gid ):
os.setgid(gid)
os.setuid(uid)
###############################################################################
# Set effective uid and gid
###############################################################################
def set_effective_uid_gid( uid, gid ):
os.setegid(gid)
os.seteuid(uid)
###############################################################################
# Get uid and gid
###############################################################################
def get_uid_gid():
uid = os.getuid()
gid = os.getgid()
return( uid, gid )
###############################################################################
def get_euid_egid():
uid = os.geteuid()
gid = os.getegid()
return( uid, gid )
###############################################################################
def get_uid_gid_for_user( username):
pwd_obj = pwd.getpwnam(username)
uid = pwd_obj.pw_uid
gid = pwd_obj.pw_gid
return( uid, gid)
#Switch to <SOMEUSER>
def switch_user():
(original_uid , original_gid) = get_uid_gid()
(analyst_uid , analyst_gid) = get_uid_gid_for_user("<SOMEUSER>")
set_effective_uid_gid(analyst_uid ,analyst_gid)
os.system('python run_this_script,py')
#Switch back to root/original
set_uid_gid(original_uid , original_gid)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.