0

在我的家庭网络上,我想从 server1 远程在 server2 上运行 python 脚本。两台服务器都在家庭网络上。我需要将文件上传到 server2 并运行 python 脚本。python 脚本需要几个小时才能完成,所以我想在 server2 的屏幕内运行它。我正在尝试使用 php 和一些 bash 脚本来实现这一点。

我在服务器 1 上的 php 脚本在同一台服务器上运行 bash 脚本。bash 脚本使用: [ssh -t user@server screen 'sudo python pyth_script.py'] 尝试在 server2 上运行 python 脚本。请注意,我使用的是 -t 选项。bash 脚本还有一个 scp 命令,用于将文件从 server1 复制到 server2。我已经使用密钥来启用从 server1 到 server2 的 ssh 命令,而无需密码。

当我从命令行运行 bash 脚本时,它运行良好。server2 上的屏幕被激活,python 程序在其中运行。我以普通用户、root 和 www-data 身份运行 bash 脚本(php 脚本通过 apache 运行,并且是用户 www-data)。在任何用户下,当从命令行运行时,bash 脚本都会按预期工作。

当我通过 php 脚本运行 bash 脚本(单击触发 php 脚本的 html 表单)时,scp 命令正常工作并且文件被传输,但是 python 脚本没有运行。包含“ssh ... screen ...”的 php 行的输出返回“必须连接到终端。”,但我使用的是 -t 选项,正如我所提到的,bash 脚本在运行时按预期运行从命令行。

任何想法我做错了什么?

使用 Web 界面远程运行 python 脚本的最佳方法是什么?

谢谢,rb3

4

1 回答 1

1

我的猜测:如果 ssh 本身没有在 tty 中运行,则 ssh 不会执行 tty,而这exec()可能没有执行。

man ssh说“多个 -t 选项强制 tty 分配,即使 ssh 没有本地 tty”但我不清楚“没有本地 tty”是什么意思。

idk...我有点想也许你应该使用phpseclib,一个纯 PHP SSH2 实现。例如。

<?php
include('Net/SSH2.php');

$ssh = new Net_SSH2('www.domain.tld');
if (!$ssh->login('username', 'password')) {
    exit('Login Failed');
}

echo $ssh->exec('screen 'sudo python pyth_script.py'');
?>

如果您需要 PTY / TTY,请查看:

http://phpseclib.sourceforge.net/ssh/pty.html

也就是说,请记住我不是屏幕专家。也许您想使用 nohup 和 &?也许你也应该标记你的问题屏幕。

于 2013-08-26T04:09:10.463 回答