-2

IP の配列を含む PHP を実行し、各 IP から特定のファイルを削除したいと思います。

このようなもの:

foreach($servers as $ip){           
   shell_exec("sh /my/dir/delete.sh ".$ip." ".$file);
}

そしてdelete.shファイルには、次のようなものがあります

ssh user@$1 'rm /my/dir/filespath/$2 '

すべてのサーバーには同じパスとファイルがあり、ユーザーとパスワードも何か提案はありますか?

編集:

sh ファイルを実行する PHP ファイルは安全な管理者ページにあり、IP はローカル IP (192.168.1.25、26、27) です。

パスからすべてのファイルを削除したい場合は、このようなことをします(現在行っているように)

ssh user@192.168.1.25 '/usr/bin/find /my/dir/filespath/* -type d -exec /bin/rm -fr {} \;'
ssh user@192.168.1.26 '/usr/bin/find /my/dir/filespath/* -type d -exec /bin/rm -fr {} \;'
ssh user@192.168.1.27 '/usr/bin/find /my/dir/filespath/* -type d -exec /bin/rm -fr {} \;'

しかし、たとえば次のような特定のファイルを1つだけ削除したい: /my/dir/filespath/other/folder/file.txt

さらにサーバーを追加したり、IP を変更したりする場合は、それらを可変にする必要があります [これは現在必須ではありません]

4

2 に答える 2

0

リモートサーバーでは、ファイルをホストして callme.php と呼ぶことができます

callme.php は次のようになります

<?php
exec("/bin/sh /path/to/deletefiles.sh");
echo 'OK';
?>

deletefiles.sh は次のようになります

#!/bin/sh 
rm -rf /path/to/file/to/delete.txt
echo 'Ok'

最後に、コマンド サーバーで次のような bash ファイルを作成できます。

#!/bin/sh
servers+=("http://1.2.3.4")
servers+=("http://1.2.3.5")
servers+=("http://1.2.3.6")
servers+=("http://www.yoursite.com")
file='/callme.php'

for i in "${servers[@]}"
do
:
  echo $i$file
  curl -s $i$file
  sleep 5
done

または、phpでリモートファイル呼び出しを行いたい場合

  <?php

 $servers[]="http://1.2.3.4";
 $servers[]="http://1.2.3.5";
 $servers[]="http://1.2.3.6";
 $servers[]="http://www.yoursite.com";

 $file = "/callme.php";

 foreach ($servers as $k => $v){
         $url = $v.$file;
         $results[] = curl_download($url);
 }
 var_dump($results);

 function curl_download($Url) {
        if (!function_exists('curl_init')) {
            die('Sorry cURL is not installed!');
        }
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $Url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }
   ?>

それを行うには最善の方法ではないかもしれませんが、うまくいきます...上記のコードはすぐに書き出したので、コードの一部は微調整が必​​要な場合があり、すべてのファイルに適切なアクセス許可があることを確認する必要があります。

于 2013-02-06T22:08:45.600 に答える
0

**解決済み**

管理人さんからのリクエストでした

if($file){
    $res = file_get_contents("http://[current server IP]/delete.php?token=12345&p=".$file);
    echo $file;
}
echo $res;

そしてdelete.phpファイルにはこれがあります

if($_GET['token']!='12345') exit();

$ips = array(192.168.1.25,192.168.1.26,192.168.1.27);

$file = $_GET['p'];
$file = str_replace(array('../','*','./'),'',$file);
if($file != ""){
    $command = '"/bin/rm -f /my/dir/filespath/'.$file.'"';
    foreach($ips as $ip){
        echo shell_exec('ssh user@'.$ip.' '.$command);
        sleep(1);// sleep 1 sec for letting the command time to delete the file (could be less)
    }
}
exit();

完璧に動作します!もちろん、delete.php ファイルのセキュリティが強化されています。これは単なるサンプル バージョンです。

全てに感謝!

于 2013-02-08T21:33:18.310 に答える