SSH 进入动态远程服务器并运行命令 - Laravel 5.8

Posted

技术标签:

【中文标题】SSH 进入动态远程服务器并运行命令 - Laravel 5.8【英文标题】:SSH into dynamic remote server and run a command - Laravel 5.8 【发布时间】:2021-11-07 01:54:53 【问题描述】:

我使用的是 L 5.8,我有一个包含 3 个输入的表单

现在,我可以使用这个包laravelcollective/remote": "~5.8 SSH 到一个特定的服务器。我需要在config/remote.phppre 配置 IP、UN、PW,如下所示:

'connections' => [
    'production' => [
        'host'      => '1.1.1.1',
        'username'  => 'code',
        'password'  => '8888',
        'key'       => '',
        'keytext'   => '',
        'keyphrase' => '',
        'agent'     => '',
        'timeout'   => 10,
    ],
],

然后,我可以轻松运行任何命令,甚至将它们链接起来

$commands = ['cd /home/code && ./runMe.sh'];
SSH::run($commands, function($line)

    echo $line.PHP_EOL;
);

结果

我的门户将连接到该服务器并成功运行该命令,并且我已经验证了它。


现在

我需要从表单输入中读取它。是否可以使用相同的插件并动态设置该文件remote.php

我应该开始寻找其他东西,因为这是一个死胡同吗?

请指教,

【问题讨论】:

remote.php 是否位于config/remote.php?编辑:刚刚看到你的更新,它是????您可以即时使用config(['remote.connections.production.host' => $request->input('host')]),就像在这个答案中一样:***.com/a/38874160/3965631(或usernameippassword等) 我们能做到吗?如果我能做到这一点,那就太酷了。我通常必须在我的控制器文件中输入我的 Input::all() 或 Request::all() ,但从未尝试过配置文件。你明白我的意思吗? 如果这段代码是从控制器调用的,或者在$requestrequest() 变量/帮助器可用的地方,你可以这样做来修改config/remote.php。 IE。你可以像这样覆盖配置设置,但我不认为你可以创建新的/将它们保存到文件等。旁注,我没有使用这个插件,所以我可能是错的,但一目了然应该好吗? 见github.com/LaravelCollective/remote/issues/41 @php_nub_qq 在他写的时候要求laravelcollective/remote作曲家包? 【参考方案1】:

此示例需要包php-ssh2,并提供多种方法来检索远程shell STDOUT 作为流。控制当前机器shell并获得响应也很棒。

sudo apt install php-ssh2

或按版本:

sudo apt install php7.4-ssh2

ssh2_exec()ssh2_fetch_stream() 的用法示例:

<?php
$ssh = ssh2_connect('192.162.68.212', 22); // Remote address
ssh2_auth_password($ssh, 'root', 'XQA8DCamdEm'); // Credentials
$shell = ssh2_shell($ssh, 'xterm'); // Choose remote shell
$stream = ssh2_exec($ssh, 'cd /home/code && ./runMe.sh'); // Remote command
stream_set_blocking($stream, true); // Wait for multiline output, till EOF
$stream_out = ssh2_fetch_stream($stream, SSH2_STREAM_STDIO); // SSH2_STREAM_STDERR
echo stream_get_contents($stream_out); // Print in real-time

可以只检索错误,这非常适合仅在不解析整个输出的情况下进行监控,使用标志SSH2_STREAM_STDERR

要从 远程 PHP 仅将 字符串 写入 STDERR,我们可以使用:

fwrite(STDERR, "Some logs, from machine (...)\n"); 

或者我们可以直接在远程shell命令中传递错误:

cd /home/code &amp;&amp; ./runMe.sh 2&gt;

https://www.php.net/manual/en/ref.ssh2.php

【讨论】:

【参考方案2】:

您可以在此处使用config() 助手:

示例配置:

config([
'remote.connections.production.host' => $request->input('hostname'),
'remote.connections.production.username' => $request->input('username'),
'remote.connections.production.password' => $request->input('password')
]);

然后调用:

$commands = ['cd /home/code && ./runMe.sh'];
SSH::run($commands, function($line)

    echo $line.PHP_EOL;
);

【讨论】:

以上是关于SSH 进入动态远程服务器并运行命令 - Laravel 5.8的主要内容,如果未能解决你的问题,请参考以下文章

python PYTHON / SSH:连接到远程服务器并运行命令

通过 ssh 连接到远程并使用 expect 运行 git 命令

第9章 使用ssh服务管理远程主机

无法使用 Runtime.Exec 传递远程命令 (ssh)

Centos 7 配置SSH远程连接及RAID 5的创建

当我已经 ssh 进入远程机器时,如何 scp 回到本地?