【问题标题】:get user machines current working directory from perl cgi从 perl cgi 获取用户机器的当前工作目录
【发布时间】:2016-04-05 07:43:35
【问题描述】:

我正在尝试使用 Perl 获取当前工作目录路径

当我从 ubuntu 执行时:$root@ubuntu:/var/test/geek# firefox http:/localhost/test.html,我得到 /var/cgi-bin 作为 perl cgi 页面中的输出而不是 /var/测试/极客。

使用的 perl 代码:

my $pwd=cwd();
 bla bla
print "<h1> pwd </h1>";

上面的代码给出了 test.pl 的路径而不是用户的工作目录路径

编辑:当我从终端单独运行脚本时,它工作正常。例如:

$root@ubuntu:/var/test/geek# /var/cgi-bin/test.pl 

我得到 /var/test/geek。但是当我使用提交按钮在 html 页面中调用脚本时,它会给出 perl 脚本的路径。

【问题讨论】:

  • 您一直在自找麻烦,一直在使用 root。您真的应该以非特权用户的身份进行开发工作,并为您需要的特权命令配置 sudo。
  • 你无法获取用户系统上的当前工作目录,因为你没有运行在用户系统上;你在你的网络服务器上运行。请准确解释您认为需要这样做的原因。

标签: perl


【解决方案1】:

每个进程都有自己的工作目录,它在创建时从其父进程继承。

cwd() 返回当前进程的工作目录。

对于 CGI 脚本,浏览器不会将其工作目录作为请求的一部分传递给服务器。要获得它,您需要在提交它的客户端系统上运行代码。这可能是用户下载的应用程序,或者可能但不太可能是一些浏览器内代码,如 Javascript/Java 小程序(出于安全原因,此信息可能对浏览器内代码隐藏)。

(其余假设 Linux,在其他操作系统上可能会有所不同)

以下部分假设您正在服务器上查找用户的工作目录:

为了获得特定用户工作目录的特定 shell,您需要识别 shell 的 PID 并从 /proc/&lt;pid&gt;/cwd 符号链接获取工作目录(要读取这些,该进程必须属于该用户运行代码,或者代码必须以root 运行(这对于 CGI 脚本来说是个坏主意)...)。要获取 shell 的 PID,您可能需要从 w 命令输出或其数据源 /var/run/utmp 开始。 Sys::Utmp 可能对此有用...然后您可能还需要检索大量额外信息以查找可能具有您正在寻找的工作目录的所有进程。

【讨论】:

  • 您需要成为 root 才能在 /proc 中查看其他用户的进程。以 root 身份运行 CGI 脚本简直是愚蠢的。
  • @glennjackman:正确,具体取决于您要查找的详细信息...w 输出需要可供多个用户访问,但这不包括工作目录...(我实际上可以确认您只能为您自己的用户阅读)提问者似乎已经决定他/她需要工作目录(他/她还没有告诉的东西,客户端或服务器)来完成某事,但没有告诉他/她想要完成什么......
  • 赞成解释@gert。我试图获取用户目录并将其显示在 html 页面上。并从网络浏览器下载或显示该目录中的特定文本文件。
  • @geek 用户需要上传文件...(至少如果它是用户 PC 上的文件,而不是网络服务器上的文件...)允许网页读取来自用户 PC 的随机文件是一个巨大的安全风险(至少未经许可)...您可以通过 Javascript 在 file:// URL 上执行此操作,具体取决于浏览器...(Chrome 不会t 工作:code.google.com/p/chromium/issues/detail?id=47416 Firefox 很复杂:developer.mozilla.org/en-US/docs/…)
【解决方案2】:

我认为您正在混合使用 Web 服务器和本地用户。运行脚本时,Web 服务器有一个工作目录,这就是 cwd() 返回的目录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-12
    • 2010-09-18
    • 2020-06-10
    • 2020-02-14
    • 2013-05-14
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多