在桌面应用中,经常需要与操作系统进行交互,比如在默认浏览器中打开网页、用系统关联的程序打开某个文件、启动一个外部工具,或者直接在文件管理器中定位某个文件夹。Tauri 将这些能力统一封装在 shell 模块中,并提供了安全的权限控制,防止前端肆意调用系统命令。
打开外部链接
使用 open 函数可以直接在用户的默认浏览器(或系统关联的应用)中打开一个 URL 或本地文件。
import { open } from '@tauri-apps/plugin-shell';
// 打开网页
await open('https://tauri.app');
// 打开本地 PDF,会用系统的默认 PDF 阅读器打开
await open('/path/to/document.pdf');
注意:open 只能接受有效的 URL 或文件路径,它不会执行任意命令,安全性由 Tauri 的权限系统保障。你必须在 capabilities 中声明 shell:allow-open 权限才能使用。
启动外部程序
如果需要运行一个外部程序(例如记事本、计算器,或你自己的命令行工具),可以使用 Command 类。它支持传递参数、设置环境变量,还能监听标准输出和错误。
import { Command } from '@tauri-apps/plugin-shell';
const cmd = Command.create('notepad.exe', ['C:/temp/note.txt']);
// 或使用 sidecar 方式运行打包进应用的可执行文件
// const cmd = Command.sidecar('my-utility', ['--input', 'data.json']);
const output = await cmd.execute();
console.log('stdout:', output.stdout);
console.log('stderr:', output.stderr);
console.log('exit code:', output.code);
安全提示:Command 默认仅允许执行在 scope 中显式列出的程序。你需要在 capabilities 中定义 shell:allow-execute,并明确指定可执行文件的路径(支持通配符),否则会抛出权限拒绝错误。这样可以有效避免任意代码执行的风险。
路径打开(在文件管理器中显示)
有时候你不需要打开文件本身,而是想在系统的文件资源管理器(如 Windows 资源管理器、macOS Finder)中高亮显示该文件或直接打开某个文件夹。Shell 插件提供了 openPath 函数,它的行为正是“打开包含该路径的文件夹并选中”。
import { openPath } from '@tauri-apps/plugin-shell';
// 在文件管理器中打开 Downloads 文件夹,并选中 example.txt
await openPath('/home/user/Downloads/example.txt');
与之相对,如果你只想打开一个文件夹(不选中特定文件),也可以用 open 直接传入文件夹路径:
await open('/home/user/Downloads');
但 openPath 更精确地完成了“定位并高亮”这一操作,特别适合下载后“打开文件夹”这类场景。
权限配置示例
在你的 src-tauri/capabilities/default.json(或其他能力文件)中,需添加如下类似配置:
{
"permissions": [
"shell:allow-open",
{
"identifier": "shell:allow-execute",
"allow": [
{
"name": "notepad",
"cmd": "C:\\Windows\\System32\\notepad.exe"
}
]
},
"shell:allow-open-path"
]
}
这样你的前端就能安全地调用上述所有 Shell 能力,而不会因权限不足而报错。
一句话总结:Tauri 的 Shell 插件用简单的三个 API——open、Command、openPath——覆盖了外部链接、程序启动和路径定位的典型场景,同时通过严格的权限白名单保证这些操作的安全性。