Revert "Rely on single private key file for optimized ssh remote fs operations"

This reverts commit aaebe01892.
This commit is contained in:
Johannes Zellner
2025-12-12 15:26:56 +01:00
parent aaebe01892
commit 1ef252fbc2
2 changed files with 16 additions and 9 deletions
+16 -2
View File
@@ -209,9 +209,16 @@ async function copyInternal(config, fromPath, toPath, options, progressCallback)
cpOptions += config.noHardlinks ? '' : 'l'; // this will hardlink backups saving space
if (config._provider === mounts.MOUNT_TYPE_SSHFS) {
const sshOptions = [ '-o', '"StrictHostKeyChecking no"', '-i', config.mountOptions._privateKeyFile, '-p', config.mountOptions.port, `${config.mountOptions.user}@${config.mountOptions.host}` ];
// we use a temporary key file instead of passing it as stdin
const identityFilePath = `/tmp/identity_file${config._managedMountPath.replaceAll('/', '-')}`;
// have to unlink first, in case a previous run crash before cleanup. With mode 0c600 we cannot overwrite it
safe.fs.unlinkSync(identityFilePath);
if (!safe.fs.writeFileSync(identityFilePath, `${config.mountOptions.privateKey}\n`, { mode: 0o600 })) throw new BoxError(BoxError.FS_ERROR, `Could not write temporary private key: ${safe.error.message}`);
const sshOptions = [ '-o', '"StrictHostKeyChecking no"', '-i', identityFilePath, '-p', config.mountOptions.port, `${config.mountOptions.user}@${config.mountOptions.host}` ];
const sshArgs = sshOptions.concat([ 'cp', cpOptions, path.join(config.prefix ?? '', fromPath), path.join(config.prefix ?? '', toPath) ]);
const [remoteCopyError] = await safe(shell.spawn('ssh', sshArgs, { shell: true }));
safe.fs.unlinkSync(identityFilePath);
if (!remoteCopyError) return;
if (remoteCopyError.code === 255) throw new BoxError(BoxError.EXTERNAL_ERROR, `SSH connection error: ${remoteCopyError.message}`); // do not attempt fallback copy for ssh errors
debug('SSH remote copy failed, trying sshfs copy'); // this can happen for sshfs mounted windows server
@@ -265,9 +272,16 @@ async function removeDir(config, limits, remotePathPrefix, progressCallback) {
progressCallback({ message: `Removing directory ${fullPathPrefix}` });
if (config._provider === mounts.MOUNT_TYPE_SSHFS) {
const sshOptions = [ '-o', '"StrictHostKeyChecking no"', '-i', config.mountOptions._privateKeyFile, '-p', config.mountOptions.port, `${config.mountOptions.user}@${config.mountOptions.host}` ];
// we use a temporary key file instead of passing it as stdin
const identityFilePath = `/tmp/identity_file${config._managedMountPath.replaceAll('/', '-')}`;
// have to unlink first, in case a previous run crash before cleanup. With mode 0c600 we cannot overwrite it
safe.fs.unlinkSync(identityFilePath);
if (!safe.fs.writeFileSync(identityFilePath, `${config.mountOptions.privateKey}\n`, { mode: 0o600 })) throw new BoxError(BoxError.FS_ERROR, `Could not write temporary private key: ${safe.error.message}`);
const sshOptions = [ '-o', '"StrictHostKeyChecking no"', '-i', identityFilePath, '-p', config.mountOptions.port, `${config.mountOptions.user}@${config.mountOptions.host}` ];
const sshArgs = sshOptions.concat([ 'rm', '-rf', path.join(config.prefix ?? '', remotePathPrefix) ]);
const [remoteRmError] = await safe(shell.spawn('ssh', sshArgs, { shell: true }));
safe.fs.unlinkSync(identityFilePath);
if (!remoteRmError) return;
if (remoteRmError.code === 255) throw new BoxError(BoxError.EXTERNAL_ERROR, `SSH connection error: ${remoteRmError.message}`); // do not attempt fallback copy for ssh errors
debug('SSH remote rm failed, trying sshfs rm'); // this can happen for sshfs mounted windows server