Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript polkit";“需要交互式身份验证”;错误现在阻止一次工作的安装脚本_Javascript_Node.js_Linux_Raspbian_Polkit - Fatal编程技术网

Javascript polkit";“需要交互式身份验证”;错误现在阻止一次工作的安装脚本

Javascript polkit";“需要交互式身份验证”;错误现在阻止一次工作的安装脚本,javascript,node.js,linux,raspbian,polkit,Javascript,Node.js,Linux,Raspbian,Polkit,我为我的一个项目用TypeScript(编译成JavaScript并在Node.js下运行)创建了一个自动安装脚本,这个脚本过去工作得很好,但现在由于出现了来自polkit的“需要交互身份验证”错误而失败,这显然是Raspbian使用的安全策略服务 脚本是使用sudo启动的,因此对于失败的事情,它应该以完全的管理员权限运行,即停止我自己的服务(service weatherService stop),并在定义该服务的/etc/default/和/etc/init.d/中创建或修改文件 我所能猜到

我为我的一个项目用TypeScript(编译成JavaScript并在Node.js下运行)创建了一个自动安装脚本,这个脚本过去工作得很好,但现在由于出现了来自
polkit
的“需要交互身份验证”错误而失败,这显然是Raspbian使用的安全策略服务

脚本是使用
sudo
启动的,因此对于失败的事情,它应该以完全的管理员权限运行,即停止我自己的服务(
service weatherService stop
),并在定义该服务的
/etc/default/
/etc/init.d/
中创建或修改文件

我所能猜到的是,最近的一些安全更新让我很难过,但具体是什么,我不知道。当我在谷歌上搜索我收到的特定错误消息,以及关于
polkit
,大多数讨论似乎都围绕着哪些用户是sudo-ers,以及sudo-ers可以做什么。但是,作为“pi”用户,在使用
sudo
运行时,我尝试做的每件事都是我仍然可以在终端窗口中完成的,没有任何问题,也没有任何“交互式身份验证”出现,迫使我对任何东西进行身份验证

代码太大,无法在此处发布,但可以在Github上找到:

…尤其是在此文件中:。。。r/build.ts

以下是一些关键片段:

试试看{
等待监视器进程(spawn('service',['weatherService','stop']),spin,ErrorMode.ANY_错误);
}
捕捉(错误){
const msg=err.message | | err.toString();
//波尔基特的悲伤?
如果(/Interactive authentication required/i.test(msg)){
//废话,废话,废话。。。
}
}
从'child_process'导入{ChildProcess,execSync,spawn as nodeSpawn};
导出函数spawn(命令:string,参数:string[],选项?:any):ChildProcess;
导出函数spawn(命令:string,uid?:number,args?:string[],选项?:any):ChildProcess;
导出函数spawn(命令:string,uidOrArgs?:string[]| number,options或args?:any,options?:any):ChildProcess{
设uid:number;
let args:string[];
如果(isNumber(uidOrArgs)){
uid=uidOrArgs;
args=选项或args | |[];
}
否则{
args=uidOrArgs | |[];
选项=选项或RGS;
uid=选项?.uid;
}
如果(uid!=null){
选项=选项{};
options.uid=uid;
如果(!options.env){
options.env={};
Object.assign(options.env、process.env);
}
options.env.HOME=userHome;
options.env.LOGNAME=sudoUser;
options.env.npm_config_cache=userHome+'/.npm';
options.env.USER=sudoUser;
}
如果(iWindows){
if(/^(chmod | chown | id)$/.test(命令)){
//实际上是一个“noop”
命令='rundll32';
args=[];
}
else if(命令=='rm'){
//即席,不是rm的通用解决方案转换!
命令='rmdir';
args=['/S','/Q',args[1]。替换(//\//g',\\')];
}
else if(命令=='which')
command='where';
const cmd=process.env.comspec | |“cmd”;
如果(选项?.uid!=null){
options=Object.assign({},options);
删除options.uid;
}
返回nodeSpawn(cmd,['/c',command,…args],options);
}
其他的
返回nodeSpawn(命令、参数、选项);
}
导出函数monitorProcess(proc:ChildProcess,markTime:()=>void=undefined,errorMode=errorMode.DEFAULT):承诺{
让错误=“”;
让输出=“”;
返回新承诺((解决、拒绝)=>{
const slowSpin=unref(设置间隔(标记时间| |无操作,最大标记时间延迟));
进程标准开启('data',data=>{
(markTime | | NO | OP)();
data=stripFormatting(data.toString());
//这会让人感到困惑,因为许多无错误的进度消息传递到stderr,而
//网页包进程不会因编译错误而退出,除非您让它这样做。
if(/(\[webpack.Progress])警告\b/.test(数据))
返回;
误差+=数据;
});
进程stdout.on('data',data=>{
(markTime | | NO | OP)();
data=data.toString();
输出+=数据;
如果(错误(数据))
错误=错误?错误+'\n'+数据:数据;
});
进程on('error',err=>{
间隙(slowSpin);
如果(errorMode!==errorMode.无错误)
解析(输出);
其他的
拒绝(错误);
});
进程on('关闭',()=>{
间隙(slowSpin);
if(errorMode!==errorMode.NO_ERRORS&&ERRORS&(errorMode===errorMode.ANY|ERROR | errorish(ERRORS)))
拒绝(错误。替换(/\bE:\s+/g',).trim());
其他的
解析(输出);
});
});
}
尽管上面的代码非常复杂,用于监视流程输出流、处理不同的操作系统和设置一些环境变量,但它实际上只是Node.js的
spawn
函数的包装,我过去能够成功生成的命令现在由于这个
polkit
问题而失败

polkit
服务似乎是一个巨大的蠕虫罐头,有许多独立的复杂策略文件定义谁可以用什么做什么。由于我试图用我的脚本做的所有事情都是sudo er通常有特权做的,我甚至不知道为什么
polkit
会在意,或者这种“交互式身份验证”看起来是什么样子——这并不是说出现了一些提示,用户或我的脚本无论如何都可以尝试与之交互

我真正希望的是(对成功的期望很低)读到这篇文章的人会有一个“哦,那个问题!”的反应。除此之外,对于任何还不熟悉类似问题的人来说,这个小故障将非常难以描述