You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:32:01