如何在 PHP 中允许这些命令:
$output = exec('sudo nginx -t 2>&1');
$output2 = exec('sudo /usr/sbin/service nginx reload 2>&1');
我已经查看了终端,但当我只需要上述两个时sudo visudo
,似乎可以访问所有sudo 命令。
我想重新加载不是那么重要,因为我可以运行一个 cron 作业来做到这一点。
我正在使用 NGINX,带有 Ubuntu 20 + PHP 7
我有一个 php 脚本,它试图使用 exec(或 shell_exec)在系统上执行二进制文件。exec 失败,返回码 127。
返回代码 127 通常表示未找到命令。所以我确保使用二进制文件的绝对路径。没变。
Apache 被配置为使用 apache 的 ChrootDir 在 chroot 中运行。
我确保将二进制文件复制到 chroot、/bin/sh 以及这两者所需的所有链接库中的正确路径中。
Apache(以及因此 php)作为 www-data 运行。我已经确认 www-data 具有对二进制文件(包括 /bin/sh)和所有父文件夹的读取和执行权限。为了确认这不是文件权限问题,我使用 /bin/sh -c 使用 sudo 运行命令:
sudo -u www-data /chrootdir/bin/sh -c /chrootdir/path/to/binary
这没有问题。
使用 strace,我得到了这个:
execve("/bin/sh", ["sh", "-c", "/path/to/binary"], 0x7ffe436b3618 /* 11 vars */) = -1 EACCES (Permission denied)
只是为了确认权限问题是针对 sh 二进制文件(以及 chrootdir 中的那个),我尝试将 /chrootdir/bin/sh 重命名为其他内容并再次执行 strace,现在它抱怨找不到文件。
所以,我现在知道问题出在通过 apache 通过 php 运行时访问 /chrootdir/bin/sh ,但不是 www-data 用户的权限。
我不确定下一步该尝试什么。
这是在 Debian 10、apache 2.4.38 和 php 7.3.11 上运行的。
我已经清除了 open_basedir,也清除了 disable_functions。
我已经确认 apache 不受 apparmor 的限制,但无论如何都禁用了它。
最后,如果我禁用 apache chroot,这确实有效。
所以我的问题是在某个地方是否有任何其他限制可能会阻止 apache 这样做?
我已经阅读了类似问题的其他答案(在步骤执行生成失败...权限被拒绝),但似乎没有一个适用。
在我将我的比特币节点升级到 v0.20.0 后,它不再在启动时启动,也不再使用systemctl start bitcoind.service
.
Journalctl 输出:-
$ journalctl -xe
...
Jul 12 15:58:22 $HOSTNAME systemd[572]: bitcoind.service: Failed to execute command: Permission denied
Jul 12 15:58:22 $HOSTNAME systemd[572]: bitcoind.service: Failed at step EXEC spawning /usr/bin/bitcoind: Permission denied
-- Subject: Process /usr/bin/bitcoind could not be executed
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- The process /usr/bin/bitcoind could not be executed and failed.
我正在使用从我的主目录软链接到/etc/systemd/system/
.
可执行文件从我的主目录软链接到 /usr/local/bin,因此我在上面链接的上一个答案表明可能适用 SELinux 问题,但我不相信它已启用:(-bash: getenforce: command not found
)。我正在运行 Debian 10.4,并相信它默认被禁用。
$ ls -al /usr/bin/bitcoind
lrwxrwxrwx 1 root root 34 May 5 2019 /usr/bin/bitcoind -> /home/$MY_NAME/src/bitcoin/src/bitcoind
$ ls -al /home/$MY_NAME/src/bitcoin/src/bitcoind
-rwxr-xr-x 1 bitcoin bitcoin 175058584 Jul 7 20:40 /home/$MY_NAME/src/bitcoin/src/bitcoind
一切都设置为在“比特币”nologin 用户下运行:
$ id bitcoin
uid=999(bitcoin) gid=999(bitcoin) groups=999(bitcoin)
$ cat /etc/passwd
...
bitcoin:x:999:999::/home/bitcoin:/bin/false
...
以下是相关目录的权限:
$ ls -al /etc/bitcoin
total 12
drwx--x--- 2 bitcoin bitcoin 4096 Jul 11 22:30 .
drwxr-xr-x 87 root root 4096 Jul 12 15:58 ..
-rw-rw---- 1 bitcoin bitcoin 601 Jul 11 22:30 bitcoin.conf
$ ls -al /var/lib/bitcoind
total 21896
drwx--x--- 5 bitcoin bitcoin 4096 Jul 9 11:55 .
drwxr-xr-x 32 root root 4096 Dec 5 2019 ..
...
$ ls -al /run
total 24
drwxr-xr-x 18 root root 560 Jul 12 15:59 .
drwxr-xr-x 22 root root 4096 Jun 2 17:46 ..
...
我很难过 - 非常感谢任何输入。
编辑 - 二进制文件路径的权限:
$ ls -al /home/$MY_NAME
total 160
drwxr-xr-x 11 XXX XXX 4096 Jul 12 15:58 .
drwxr-xr-x 3 root root 4096 May 4 2019 ..
...
drwxr-xr-x 6 XXX XXX 4096 Oct 25 2019 src
...
$ ls -al /home/$MY_NAME/src
total 24
drwxr-xr-x 6 XXX XXX 4096 Oct 25 2019 .
drwxr-xr-x 11 XXX XXX 4096 Jul 12 15:58 ..
drwxr-xr-x 15 XXX XXX 4096 Jul 7 20:26 bitcoin
...
$ ls -al /home/$MY_NAME/src/bitcoin
total 1976
drwxr-xr-x 15 XXX XXX 4096 Jul 7 20:26 .
drwxr-xr-x 6 XXX XXX 4096 Oct 25 2019 ..
...
drwxr-xr-x 28 XXX XXX 12288 Jul 7 21:01 src
...
$ ls -al /home/$MY_NAME/src/bitcoin/src
total 936796
drwxr-xr-x 28 XXX XXX 12288 Jul 7 21:01 .
drwxr-xr-x 15 XXX XXX 4096 Jul 7 20:26 ..
...
-rwxr-xr-x 1 bitcoin bitcoin 175058584 Jul 7 20:40 bitcoind
...
我正在尝试通过我的服务器上的 PHP 使用 Scilab,如本文档中所述。
我正在运行 Ubuntu 16.04。我有一个 Apache 服务器正在运行。我用apt-get install scilab
. 我可以成功编写 scilab 代码,例如:
scilab -nwni -nb -e "m=[1 2 3; 3 4 5];disp(m);exit"
所以现在我正在尝试从 PHP 执行它。我尝试了文档中的示例。例如:
<?php
exec('scilab -nwni -nb -e "m=[1 2 3; 3 4 5];disp(m);exit;"', $output);
print_r($output);
?>
但我总是得到:
Error: Impossible to define SCIHOME environment variable.
SCIHOME not defined.
我不知道我做错了什么以及如何解决它......
任何帮助将不胜感激 !
如下,我只希望命令echo "this is to stdout"
输出到我的屏幕而不是文件ok.log
,我该怎么办?
我搜索了exec
shell命令的用法,但没有结果,请指教
[root@161 tmp]# bash --version
GNU bash, version 4.2.46(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
[root@161 tmp]# cat 2.sh
#!/bin/bash
exec 1>ok.log
exec 2>error.log
#exist dir
ls /home/
#no exist dir
ls /etca/
#to stdout
echo "this is to stdout"
#other cmds
...
我正在寻找通过 SSH 调用远程命令的最佳方式。我创建用户“rpcall”,生成新证书并填写 authorized_keys。用更多的方式保护它
from="ip",no-agent-forwarding,no-X11-forwarding,no-port-forwarding,no-pty ssh-rsa ......
现在用户 rpcall 无法登录到终端
ssh -l rpc 192.168.12.1
PTY allocation request failed on channel 0
但是可以运行任何命令
ssh -l rpc 192.168.12.1 cat /etc/passwd
有什么解决方案可以将命令执行限制在一个处理脚本中吗?例如/home/rpcall/bin/command.sh
我为此用户设置了 bash shell 并使用 .bashrc 强制运行处理脚本,但我不知道如何从 ssh 调用传递参数。
.bashrc 用户 rpcall
/home/rpcall/bin/command.sh $params1 $params2
exit
从其他机器ssh调用
ssh -l rpcall 192.168.12.1 "param1" "param2"
我有一个脚本,实际上只需要在服务器上运行一次,即在部署时,但我认为最好让 Puppet 管理它。该脚本重新映射了几个与本地系统用户冲突的旧用户 ID。
我检查这个的方法是 gopher 用户是否具有默认 uid 13。如果是这样,那么我需要运行我的重新映射脚本。
exec { "change_uid":
command => "/script/to/run.sh",
provider => 'shell',
path => [ "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin" ],
onlyif => "test `/usr/bin/id -u gopher` -eq 13; echo $?",
}
我已经尝试了上述onlyif
检查的几种不同排列,但 exec 总是被代理人解雇。
当我直接在命令行上运行该命令时,它返回 0 或 1。这可能与 bash在 true 时返回 0 而在 false 时返回 1这一事实有关,但我认为更有可能是我误解了onlyif
工作方式.
当 gopher 的 uid=13 时,我怎样才能让这个 exec 启动?我愿意接受其他方法来实现我在这里想要完成的事情。
更新
我放弃了回声部分。最终的工作解决方案是:
exec { "change_uid":
command => "/script/to/run.sh",
path => [ "/bin", "/sbin", "/usr/bin", "/usr/sbin", "/usr/local/bin", "/usr/local/sbin" ],
onlyif => "test `id -u gopher` -eq 13",
}
使用ralsh
命令有助于测试,感谢@Daniel C. Sobral。我将@Daniel 标记为已接受的答案,因为这是主要问题,除了我对一些概念的误解,而且他首先回答了问题。谢谢大家。