Сценарий:
У нас есть pdf-файлы на сервере server2, названные по номеру билета, то есть 2543675.pdf. Из-за того, что пользователи допускают ошибки при правильном переименовании файлов и приводят к зависанию импорта, мне было поручено переименовать эти файлы автоматически через веб-интерфейс всего одной кнопкой нажмите, чтобы начать переименование файлов в формат ticketnumber_customerNumber_customerName.pdf. Для этого мне нужно переместить / rsync файлы с server2 на server1. Извлеките базовое имя из pdf-файла, который является номером клиента, запустите запрос к таблице заявок клиента в некоторой базе данных и переименуйте файлы с данными, полученными из таблицы заявок. После этого я перевожу / rsync файлы обратно на server1 с помощью rsync, где файлы затем загружаются / импортируются автоматизированной системой, которая ожидает, что они будут названы правильно, иначе процесс завершится неудачно и остановит рабочий процесс.
Тестовая среда с использованием виртуальных машин Virtualbox:
server1 192.168.1.2 Centos 7 — хостинг веб-интерфейса для rsync
server2 192.168.1.3 Ubunutu 10 — хостинг SMB поделиться с pdf
рабочая станция 192.168.1.100 Рабочая станция вызывает скрипт php через веб-страницу
Что я пробовал:
Сервер1
1. Сгенерировал ключи ssh и скопировал их на удаленный сервер server2 для автоматической аутентификации через ключ. Используется ssh-copy-id
2. Скопировал ключи ssh в / Opt / WWW-файлы каталог на сервере1
3. Сменил владельца на апач: апач для / opt / www-файлов на сервере1
4. Текущий доступ к каталогу www-файлов 755, файлов id_rsa 600, id_rsa.pub 644
5. Запустил веб-интерфейс readFiles2.php, и он не работал при запуске скрипта. Я получаю сообщение об ошибке в журнале Apache:
[Fri Aug 03 12:54:16.432825 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: ssh2_connect(): Unable to connect to 192.168.1.3 on port 22 in /var/www/html/readFiles2.php on line 20
[Fri Aug 03 12:54:16.432886 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: ssh2_connect(): Unable to connect to 192.168.1.3 in /var/www/html/readFiles2.php on line 20
[Fri Aug 03 12:54:16.432910 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: ssh2_fingerprint() expects parameter 1 to be resource, boolean given in /var/www/html/readFiles2.php on line 21
[Fri Aug 03 12:54:16.432920 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: ssh2_auth_pubkey_file() expects parameter 1 to be resource, boolean given in /var/www/html/readFiles2.php on line 22
[Fri Aug 03 12:54:16.432960 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: ssh2_exec() expects parameter 1 to be resource, boolean given in /var/www/html/readFiles2.php on line 27
[Fri Aug 03 12:54:16.432970 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: ssh2_fetch_stream() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 28
[Fri Aug 03 12:54:16.432986 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: stream_set_blocking() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 30
[Fri Aug 03 12:54:16.432997 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: stream_set_blocking() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 31
[Fri Aug 03 12:54:16.433010 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: stream_get_contents() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 34
[Fri Aug 03 12:54:16.433019 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: stream_get_contents() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 36
[Fri Aug 03 12:54:16.433043 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: fclose() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 42
[Fri Aug 03 12:54:16.433051 2018] [:error] [pid 1670] [client 192.168.1.100:40808] PHP Warning: fclose() expects parameter 1 to be resource, null given in /var/www/html/readFiles2.php on line 43
если я запускаю readFiles1.php из веб-интерфейса a, я получаю необъяснимую ошибку в apache, но если я запускаю этот скрипт из консоли от имени пользователя root, он работает нормально. Файлы передаются туда и обратно в зависимости от того, какую команду я запускаю в скрипте.
Ошибка Apache:
SSH: подключение к хосту 192.168.1.3 порт 22: разрешение запрещено rsync: соединение неожиданно закрыто (получено 0 байт) [Получатель] ошибка rsync: необъяснимая ошибка (код 255) в io.c (226) [Receiver = 3.1.2]
Расположение файлов сервера
Server1
/
├── opt
│ └── www-files
│ ├── id_rsa
│ └── id_rsa.pub
│
├── var
│ └── www
│ └── html
│ ├── files
│ ├── readFiles1.php
│ └── readFiles2.php
Server2
/
├── srv
│ └── pdfs
│ ├── 2534566.pdf
│ ├── 2456345.dpf
│ ├── 2643123.pdf
│ ├── 2456256.pdf
│ ├── 2789023.pdf
│ ├── 2567454.pdf
│ ├── 2876430.pdf
. .
. .
. .
Автор сценария: readFiles1.php
<?php
function readFiles($dir){
if(is_dir($dir)){
if($dh=opendir($dir)){
while(($file = readdir($dh)) != false){
echo "Filename: ".$file."<br>";
}
closedir($dh);
}
}
}
//$cmd = 'rsync -av --ignore-existing --remove-source-files /var/www/html/files/* [email protected]:/srv/pdfs/';
$cmd = "rsync -av --ignore-existing --remove-source-files [email protected]:/srv/pdfs/ /var/www/html/files/";
shell_exec($cmd);
$dir_source = "./files/";
readFiles($dir_source);
?>
Автор сценария: readFiles2.php Нашел этот скрипт в интернете, пришлось установить некоторые зависимости.
<?php
include('/usr/share/pear/Net/SSH2.php');
function readFiles($dir){
if(is_dir($dir)){
if($dh=opendir($dir)){
while(($file = readdir($dh)) != false){
echo "Filename: ".$file."<br>";
}
closedir($dh);
}
}
}
function runRemoteSSH($command){
$connection = ssh2_connect('192.168.1.3');
$ssh_key = ssh2_fingerprint($connection);
ssh2_auth_pubkey_file($connection, 'root','/opt/www-files/id_rsa.pub','/opt/www-files/id_rsa');
$log = array();
$log[] = "Sending command: ".$command;
$log[] = "--------------------";
$stream = ssh2_exec($connection, $command);
$streamError = ssh2_fetch_stream($stream, SSH2_STREAM_STDERR);
stream_set_blocking($streamError, true);
stream_set_blocking($stream, true);
$log[] = "output of command: ";
$log[] = stream_get_contents($stream);
$log[] = "------------------";
$error = stream_get_contents($stream);
if(strlen($error) > 0 ){
$log[] = 'Error occured:';
$log[] = $error;
$log[] = "--------";
}
fclose($streamError);
fclose($stream);
}
//$cmd = 'rsync -av --ignore-existing --remove-source-files /var/www/html/files/* [email protected]:/srv/pdfs/';
$cmd = "rsync -av --ignore-existing --remove-source-files [email protected]:/srv/pdfs/ /var/www/html/files/";
runRemoteSSH($cmd);
$dir_source = "./files/";
readFiles($dir_source);
?>
Сценарий 3 (readFiles3.php): Получает файлы с локального общего ресурса SMB, здесь работает нормально, так как не требуется ssh-соединение.
<?php
function readFiles($dir){
if(is_dir($dir)){
if($dh=opendir($dir)){
while(($file = readdir($dh)) != false){
if($file != "." && $file != ".."){
$list = explode(".",$file);
$source_file = "./files/".$file;
$target_file = "./files/".$list[0]."_custno_custname.".$list[1];
echo "Renaming file[$source_file] to [$target_file]<br>";
rename($source_file, $target_file);
}
}
closedir($dh);
}
}
}
$cmd = "rsync -av --ignore-existing --remove-source-files /srv/smb/tickets/ /var/www/html/files";
echo "Getting files....<br>";
shell_exec($cmd);
$dir_source = "./files/";
readFiles($dir_source);
echo "Moving files back....<br>";
$cmd = "rsync -av --ignore-existing --remove-source-files /var/www/html/files/ /srv/smb/tickets/ ";
shell_exec($cmd);
?>
Задача ещё не решена.
Других решений пока нет …