Swift中Process调用sudo无法读取标准输入导致无法输入密码问题
问题解决:Swift Process调用sudo无法输入密码的问题
你用Swift的Process类执行sudo命令时进程挂起、没法输入密码,核心原因是Process默认没有将子进程的标准输入、输出、错误流关联到当前终端——sudo需要直接和终端(tty)交互读取密码,找不到输入源就会卡住。而Python、Go这类语言的子进程API默认会继承父进程的终端句柄,所以能正常弹出密码输入提示。
修复代码
手动将Process的标准输入、输出、错误重定向到当前终端的对应句柄即可:
import Foundation let process = Process() process.executableURL = URL(fileURLWithPath: "/usr/bin/sudo") process.arguments = ["ls"] // 关联终端流,让sudo能和用户交互 process.standardInput = FileHandle.standardInput process.standardOutput = FileHandle.standardOutput process.standardError = FileHandle.standardError do { try process.run() process.waitUntilExit() } catch { print("执行出错:\(error)") }
补充说明
如果你的场景不需要交互式输入(比如提前配置了sudo免密规则),可以给sudo加-n参数以非交互模式运行,但这只适用于不需要密码的场景。如果必须输入密码,就一定要关联终端流,保证sudo能和用户正常交互。
内容的提问来源于stack exchange,提问作者Nikolay Edigaryev
相关产品推荐
相关产品推荐

