我是ubuntu用户..我在php中有一个命令执行python文件.. python文件设置为可执行..所以,我的php命令是: -
shell_exec("try.py");
python文件位于桌面..但php文件位于www文件夹..
/var/www/try.php
在try.py中的,我有一个代码来重命名桌面上的文件,如下所示: -
print "enter"
os.rename("a.txt", "b.txt")
print "exit"
所以,try.py和a.txt在桌面上..
我的问题是,当我执行php文件时,它会显示"输入"只是但没有"退出" ..所以我想它不能执行os.rename可能是因为root权限或任何我不知道的..我已经尝试了一些解决方案来禁用sudo的密码但是我仍然没有显示"退出"。
但是,如果我直接通过在桌面上双击它并执行它来执行try.py,则命令可以完成并且输出显示: -
enter
exit
所以,谁知道如何使用php执行它?
答案 0 :(得分:1)
您可以使用rename
功能直接重命名php
中的文件。
rename($oldname, $newname);
答案 1 :(得分:1)
问题在于,当您正在os.rename("a.txt", "b.txt")
时,它正在运行应用程序的目录中查找a.txt
(因此它正在a.txt
中查找/var/www/
您应该为a.txt
和b.txt
提供完整路径:
os.rename('/home/user/Desktop/a.txt', '/home/user/Desktop/b.txt')
您还必须确保www-data
(或任何正在运行Apache的用户)可以写入Desktop目录;但从安全角度来看,这是一个非常糟糕的主意 - 服务器上运行的任何脚本都可以读取桌面内容(甚至删除文件)。
答案 2 :(得分:1)
最后,我得到了解决方案..
为了能够使用os.rename重命名桌面文件,我们需要编辑sudoers中的一些配置..
它涉及visudo的一些步骤以及php脚本..
在visudo中(使用命令" sudo visudo"在终端中:) -
#user privilege specification
root All=(ALL:ALL) ALL
www-data ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
ubuntu ALL=(ALL) NOPASSWD: ALL //use your username.. mine is ubuntu
www-data ALL=(ALL) NOPASSWD: ALL //the place where i put the php file
在php文件中: -
<?php
$output = exec("sudo python /home/ubuntu/Desktop/[filename.py]");
?>
对于python文件是一样的..
os.rename("a.txt", "b.txt")
好..这就是解决方案..现在我可以运行python脚本,它将从php更改桌面文件的名称..
感谢您对解决方案的所有意见和建议。=))
答案 3 :(得分:0)
您需要以下内容:
my_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
这将等同于try.py实际上在的目录。
然后你可以执行:
os.rename(os.path.join(my_dir, 'a.txt'), os.path.join(my_dir, 'b.txt'))
如上所述,从安全PoV来看,这并不是一个好主意,因为你必须向php脚本授予写权限。
我通常也将my_dir代码放在if sys.argv[0]:
中,这样我仍然可以从python REPL调试:
if sys.argv[0]:
# running as executable
my_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
else:
# imported into interpreter
my_dir = '.'
这样我仍然可以将模块导入REPL进行调试,只要我在与相关文件相同的目录中。