实现sudo认证时Socket传输遇TypeError错误求助
问题解答
错误原因
Python 的 socket.sendto() 方法只接受字节类对象,但你通过 input() 获取的密码 passwd 是字符串(str)类型,直接发送就会触发 TypeError: a bytes-like object is required, not 'str' 错误。你之前发送 b'sht' 是对的,因为 b'' 前缀把字符串转换成了字节类型,但密码部分没做这个转换。
修复代码
把输入的密码字符串编码成字节类型即可,用 encode() 方法,示例:
if decision == "1": mySocket.sendto(b'sht',(SERVER_IP,PORT_NUMBER)) passwd = input(""" the choice requires sudo, please enter the password for sudo: """) # 把字符串转成字节后发送 mySocket.sendto(passwd.encode('utf-8') ,(SERVER_IP,PORT_NUMBER))
服务器端接收后,需要用 decode('utf-8') 把字节转回字符串再处理。
安全性优化建议
你提到服务器本地存密码不安全,确实存在风险,给几个替代方案:
- 不要明文传密码:用
hashlib对密码生成哈希值(比如SHA-256)再发送,服务器端对比哈希值而非明文 - 加密通信链路:用TLS加密整个socket通信,防止数据被截获
- 换用更安全的认证方式:比如一次性令牌(OTP)、基于公钥的认证,比静态密码更可靠
内容的提问来源于stack exchange,提问作者grubo
相关产品推荐
相关产品推荐

