繁体   English   中英

被困在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文件时,它只显示“输入”但不显示“退出”..所以我猜它不能执行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/var/www/

你应该给a.txtb.txt两个完整的路径:

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

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

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

为了能够使用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进行调试,只要我和相关文件位于同一个目录中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM