Python Linux 命令行 sudo

2017-01-10 10:04:57来源:oschina作者:扫把就是扫把人点击

经常会有python调用shell命令的需求。subprocess, os.system() 等等都是常用的方式。


但是遇到需要调用的命令需要root权限的时候,就比较麻烦了。


就是会让输入密码。

现在知道有两种解决方法:


1. Linux 特殊权限 s


2. 模块 sh

1. Linux 特殊权限 s


文件权限除了r、w、x外还有s、t、i、a权限:


s:文件属主和组设置SUID和GUID,文件在被设置了s权限后将以root身份执行。


在设置s权限时文件属主、属组必须先设置相应的x权限,否则s权限并不能正真生效(c h m o d命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错,当我们ls -l时看到rwS,大写S说明s权限未生效)。


比如 fdisk -l 命令:


bwhite@os:~$
bwhite@os:~$ fdisk -l
fdisk: cannot open /dev/ram0: Permission denied
fdisk: cannot open /dev/sda: Permission denied
bwhite@os:~$ which fdisk
/sbin/fdisk
bwhite@os:~$ sudo cp /sbin/fdisk /bin/my_fdisk
[sudo] password for bwhite:
bwhite@os:~$ sudo chmod u+s /bin/my_*
bwhite@os:~$ ll /bin/my_*
-rwsr-xr-x 1 root root 109632 1月 9 19:41 /bin/my_fdisk*
bwhite@os:~$ /bin/my_fdisk -l
Disk /dev/ram1: 64 MiB, 67108864 bytes, 131072 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytesDevice BootStartEndSectors Size Id Type
/dev/sda1* 2048 79691775 7968972838G 83 Linux
/dev/sda279693822 838840314190210 2G5 Extended
/dev/sda579693824 838840314190208 2G 82 Linux swap / Solaris
bwhite@os:~$

2. 模块 sh


# -*- coding=utf-8 -*-
import sh
import osdef main():
PASSWORD = "tiger"
devide = "/dev/sdb4"
os.system("sync;sync;sync;sync")
my_sudo = sh.sudo.bake("-S", _in=PASSWORD)
try:
my_sudo.umount(device)
except:
passif __name__ == '__main__':
main()

参考链接:


sh 下载:https://pypi.doubanio.com/simple/sh/


http://amoffat.github.io/sh/sections/sudo.html#contrib-sudo

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台