Stuck at os.rename()


Stuck at os.rename()

我是 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文件时,它只显示"Enter"而不是"exit"..所以我想它无法执行os.rename可能是因为root权限或任何我不知道的东西.. 我已经尝试了一些解决方案来禁用Sudo的密码,但我仍然没有显示"退出"。

但是,如果我通过在桌面上双击它直接执行 try.py 并执行它,则可以完成该命令并输出显示:-

enter
exit

那么,有人知道如何使用 PHP 执行它吗?

您可以使用

rename函数直接重命名php中的文件。

rename($oldname, $newname);

问题是当你在做os.rename("a.txt", "b.txt")时,它会在运行应用程序的目录中查找a.txt(所以它正在/var/www/中寻找a.txt

您应该为a.txtb.txt提供完整路径:

os.rename('/home/user/Desktop/a.txt', '/home/user/Desktop/b.txt')

您还必须确保www-data(或运行Apache的任何用户(可以写入桌面目录;但是从安全角度来看,这是一个非常糟糕的主意 - 服务器上运行的任何脚本都可以读取桌面的内容(甚至删除文件(。

最后,我得到了解决方案。

为了能够使用 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更改桌面中文件的名称。

感谢您对解决方案的所有意见和建议。 =((

你需要这样的东西:

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 进行调试。