我需要以root身份运行bash脚本(无密码sudo或su不可行),因为你无法在Linux中设置脚本,我想从可执行文件调用它并使其成为 setuid:
$ cat wrapper.c
int main(void)
{
system("/bin/bash ./should_run_as_root.sh");
}
$ gcc -o wrapper wrapper.c
$ sudo chown root wrapper
$ sudo chmod ug+s wrapper
$ ll wrapper
-rwsr-sr-x 1 root users 6667 2009-02-17 11:11 wrapper
$
Run Code Online (Sandbox Code Playgroud)
这有效 - 就像正确运行脚本一样 - 但脚本以执行"./wrapper"的用户身份运行.
为什么?以及如何正确实现这一点?
谢谢!
我想写这样的东西:
if [[ ( releases["token"] & $MASK ) -eq 1 ]]; then
Run Code Online (Sandbox Code Playgroud)
但我得到的错误是:
意外的令牌"&",预期的条件二元运算符
如何在if语句中使用按位运算符?
一位朋友问我这个问题,我给了事实上两个选择.
第一种方法,测试文件权限:
//adapted from https://stackoverflow.com/questions/11775884/nodejs-file-permissions#answer-11781404
var fs = require('fs')
function canWrite(directory) {
var stat = fs.statSync(directory)
// 2 is the octal value for chmod -w-
return !!( 2 & (stat.mode & parseInt('777', 8)).toString(8)[0] ) //first char is the owner
}
Run Code Online (Sandbox Code Playgroud)
如果user(process.uid)不是文件系统所有者(stat.uid)也不在它的group(process.gid vs stat.gid)中怎么办?它仍然会获得644权限并且无法写入.
我们怎样才能真正知道(使用nodejs)当前用户属于文件系统组(stat.gid)?容易在bash中,但可移植它会是与一个的NodeJS乱七八糟.
第二种方式,懒惰:
var fs = require('fs')
var canWrite = true
try {
fs.writeFileSync('./test')
fs.unlinkSync('./test')
} catch(e) {
canWrite = false
}
if(canWrite) {
//go …Run Code Online (Sandbox Code Playgroud)