2016-05-04 78 views
-1

我已經使用終端成功更改了/ etc/config/uhttpd文件中的SSH端口。但我似乎無法找到一種方法來從PHP動態執行它。爲了解釋,我需要我的服務器在Yun上自動設置linux系統上的端口。所以基本上我需要它來自動更改uhttpd文件中的端口號。提前致謝。使用PHP動態更改arduino yun上的httpd SSH端口

+0

通過自動更改端口並動態更改端口,您的意思是什麼?你想要一個PHP腳本來遠程更改配置文件嗎?像這樣:'./myscript.php --host = somehost --port = 8788'? –

+0

是的,我需要php腳本來將Linux芯片使用的監聽端口從默認80更改爲不同的端口。 – user3381715

回答

0

Setup SSH keys用於無密碼訪問遠程服務器。

如果用戶不是root,請通過sudo命令將遠程/etc/sudoers配置爲執行無密碼命令。例如,可以將遠程用戶添加到uhttpd組(遠程):

sudo gpasswd -a user uhttpd 

然後讓其無需密碼

%uhttpd ALL=(ALL) NOPASSWD: ALL 

我們允許簡單ALL命令運行list命令。您可以改爲列出特定的命令。請參閱man sudoers

寫類似以下的腳本:

#!/usr/bin/env php 
<?php 
namespace Tools\Uhttpd\ChangePort; 

$ssh_user = 'user'; // Change this 
$ssh_host = 'remote.host'; // Change this 
$remote_config = '/etc/config/uhttpd'; 

////////////////////////////////////////////////////// 

if (false === ($o = getopt('p:', ['port:']))) { 
    fprintf(STDERR, "Failed to parse CLI options\n"); 
    exit(1); 
} 

// Using PHP7 Null coalescing operator 
$port = $o['p'] ?? $o['port'] ?? 0; 
$port = intval($port); 
if ($port <= 0 || $port > 65535) { 
    fprintf(STDERR, "Invalid port\n"); 
    exit(1); 
} 

$sudo = $ssh_user == 'root' ? '' : 'sudo'; 

$sed = <<<EOS 
"s/option\s*'listen_http'\s*'[0-9]+'/option 'listen_http' '$port'/" 
EOS; 

// Replace port in remote config file 
execute(sprintf("ssh %s -- $sudo sed -i -r %s %s", 
    "{$ssh_user}@{$ssh_host}", $sed, 
    escapeshellarg($remote_config))); 

// Restart remote daemon 
execute("$sudo /etc/init.d/uhttpd restart"); 

////////////////////////////////////////////////////// 

/** 
* @param string $cmd Command 
* @return int Commands exit code 
*/ 
function execute($cmd) { 
    echo ">> Running $cmd\n"; 

    $desc = [ 
    1 => ['pipe', 'w'], 
    2 => ['pipe', 'w'], 
    ]; 

    $proc = proc_open($cmd, $desc, $pipes); 
    if (! is_resource($proc)) { 
    fprintf(STDERR, "Failed to open process for cmd: $cmd\n"); 
    exit(1); 
    } 

    if ($output = stream_get_contents($pipes[1])) { 
    echo $output, PHP_EOL; 
    } 

    if ($error = stream_get_contents($pipes[2])) { 
    fprintf(STDERR, "Error: %s\n", $error); 
    } 

    fclose($pipes[1]); 
    fclose($pipes[2]); 

    if (0 != proc_close($proc)) { 
    fprintf(STDERR, "Command failed(%d): %s\n", $exit_code, $cmd); 
    exit(1); 
    } 
} 

保存到chport.php並使其可執行:

chmod +x chport.php 

然後你可以使用它像這樣:

./chport.php --port=10000 

您可能希望將腳本中使用的命令封裝在shell腳本中,然後在中列出它們。