Как разрешить Node.js child_process.execSyn c запускать `scp -P 4422 root@myserver.com: / data / backups / ...` без получения отказа в разрешении - PullRequest
0 голосов
/ 05 марта 2020

Я запускаю простой Node.js процесс резервного копирования моих данных каждый день, используя child_process.execSync для запуска:

scp -P 4422 root@myserver.com:/data/backups/dbs.zip /data/backups/dbs.zip

Обратите внимание, что если я запускаю вышеуказанную команду напрямую, она будет работать. Но когда я делаю это в Node, я получаю следующий журнал:

[2020-03-04 05:00:00] error downloading backup...Command failed:

Permission denied, please try again.
root@myserver.com: Permission denied (publickey,password).

Нужно ли мне создавать файл ключа для Node.js 'child_process, чтобы использовать его при запуске scp? Если так, то почему, если я запускаю scp -i id_rsa.pem -P 4422 root@myserver.com:/data/backups/dbs.zip /data/backups/dbs.zip в Node.js, он просто зависает (как будто он даже останавливает выполнение любых асин c действий, таких как appendFile. Он также создал множество процессов, называемых (node), и эти процессы не может быть убит.

const path = require('path');

const {
  backupPath,
  downloadPath
} = require('../../conf');

const keyPath = path.join(
  __dirname,
  '../../key/id_rsa.pem'
);

const downloadProcess = log => {
  const { execSync } = require('child_process');
  log('downloading backup...');
  try {
    const date = new Date();
    const backupName = `db_${date.format('yyyy-MM-dd')}.tar.gz`;
    const command = `scp -i ${keyPath} -P 4422 root@myserver.com:${backupPath}/${backupName} ${downloadPath}/${backupName}`;
    log(`running command: ${command}`);
    const stdout = execSync(command);
    log(`downloaded backup ${backupName} at ${downloadPath}${'\n'}stdout:${'\n'}${stdout}`);
  } catch (e) {
    log(`error downloading backup...${e.message}`);
  }
}

module.exports = downloadProcess;
...