Dateien in Node.js mit ssh2-sftp-client nach SFTP exportieren
Sichere Dateiübertragungen sind entscheidend für den Schutz sensibler Daten. SFTP (Secure File
Transfer Protocol) ist eine zuverlässige Methode, um Dateien sicher über ein Netzwerk zu übertragen.
In diesem DevTip zeigen wir, wie Sie mit Node.js und der Open-Source-Bibliothek
ssh2-sftp-client Dateiübertragungen zu und von einem SFTP-Server effizient abwickeln.
ssh2-sftp-client ist ein praktischer, Promise-basierter Wrapper um die leistungsstarke
Bibliothek ssh2 und vereinfacht SFTP-Vorgänge.
Einführung in SFTP
SFTP ist ein sicheres Protokoll auf Basis von SSH (Secure Shell), das verschlüsselte Dateiübertragungen bietet. Es gewährleistet Datenintegrität und Vertraulichkeit und eignet sich damit ideal für die Übertragung sensibler Informationen.
Ihre Node.js-Umgebung einrichten
Dieses Beispiel verwendet ssh2-sftp-client 12.x mit Node.js 22 oder neuer. Ihre
Installation können Sie mit folgendem Befehl überprüfen:
node -v
npm -v
ssh2-sftp-client installieren und konfigurieren
Installieren Sie die Bibliothek ssh2-sftp-client mit npm:
npm install ssh2-sftp-client@12
Verbinden, Hochladen, Herunterladen und Fehlerbehandlung
So stellen Sie eine Verbindung her, laden eine Datei hoch, laden eine Datei herunter und behandeln
Fehler zuverlässig. Setzen Sie SFTP_HOST, SFTP_USERNAME,
SFTP_PASSWORD und SFTP_HOST_SHA256 über Ihre Umgebung. Fordern Sie den
Host-Key-Fingerprint des Servers über einen vertrauenswürdigen Kanal bei dessen Administrator an.
SFTP_HOST_SHA256 muss der 64-stellige SHA-256-Hex-Digest der rohen SSH-Public-Key-Bytes
in Kleinbuchstaben sein, nicht die base64-Form SHA256:, die viele SSH-Werkzeuge
anzeigen. Übernehmen Sie diesen Wert nicht aus einer ungeprüften ersten Verbindung.
const Client = require('ssh2-sftp-client')
const fs = require('fs') // Required for the dummy file creation
async function main() {
const { SFTP_HOST, SFTP_USERNAME, SFTP_PASSWORD, SFTP_HOST_SHA256 } = process.env
if (!SFTP_HOST || !SFTP_USERNAME || !SFTP_PASSWORD || !/^[a-f0-9]{64}$/.test(SFTP_HOST_SHA256 || '')) {
throw new Error('SFTP credentials and a verified SHA-256 host-key fingerprint are required')
}
const sftp = new Client()
const config = {
host: SFTP_HOST,
port: 22, // Use an integer for the port
username: SFTP_USERNAME,
password: SFTP_PASSWORD,
hostHash: 'sha256',
hostVerifier: (fingerprint) => fingerprint === SFTP_HOST_SHA256,
readyTimeout: 10000,
}
const localPath = './local-file.txt'
const remotePath = '/remote/path/file.txt'
const localDownloadPath = './downloaded-file.txt'
// Create a dummy file for upload example if it doesn't exist
if (!fs.existsSync(localPath)) {
fs.writeFileSync(localPath, 'This is a test file for SFTP upload.')
console.log(`Created dummy ${localPath} for testing.`)
}
try {
await sftp.connect(config)
console.log('Connected successfully to SFTP server.')
// Uploading files
console.log(`Attempting to upload ${localPath} to ${remotePath}...`)
await sftp.put(localPath, remotePath)
console.log('File uploaded successfully.')
// Downloading files
console.log(`Attempting to download ${remotePath} to ${localDownloadPath}...`)
await sftp.get(remotePath, localDownloadPath)
console.log('File downloaded successfully.')
} finally {
await sftp.end()
}
}
main().catch(() => {
console.error('SFTP transfer failed; check configuration, host identity, and permissions')
process.exitCode = 1
})
Im obigen Beispiel haben wir unsere SFTP-Vorgänge in einer asynchronen
(async) Funktion namens main gekapselt. Diese
Funktion stellt die Verbindung zum Server her, lädt eine Datei hoch und anschließend wieder herunter.
Der Block try...finally sorgt dafür, dass die SFTP-Verbindung mit
sftp.end() geschlossen wird, unabhängig davon, ob die Vorgänge erfolgreich waren
oder ein Fehler aufgetreten ist. Außerdem erstellen wir eine Dummy-Datei
local-file.txt, damit das Upload-Beispiel ausgeführt werden kann. Wählen Sie entfernte
und lokale Download-Pfade, die gefahrlos ersetzt werden dürfen; diese Übertragungsmethoden können
vorhandene Dateien überschreiben. Fehlgeschlagene Übertragungen führen zu einem Exit-Status ungleich
null, sodass ein geplanter Job nicht fälschlicherweise Erfolg meldet.
Der zugrunde liegende ssh2-Client akzeptiert
Host-Keys standardmäßig, wenn keine Prüffunktion angegeben ist. Verschlüsselung allein ist keine
Server-Authentifizierung; die explizite Fingerprint-Prüfung ist unerlässlich, um einen unerwarteten
Server-Key zu erkennen.
Bewährte Verfahren für sichere und effiziente Dateiübertragungen
- Verwenden Sie immer starke Authentifizierungsmethoden. Für mehr Sicherheit wird eine
SSH-schlüsselbasierte Authentifizierung dringend empfohlen. Dafür können Sie die Option
privateKeyin der Konfiguration vonconnectnutzen. Ausführliche Beispiele finden Sie in der Dokumentation zussh2-sftp-clientundssh2. - Aktualisieren Sie Ihre Bibliotheken und Abhängigkeiten regelmäßig.
- Validieren Sie Dateipfade und Berechtigungen.
- Implementieren Sie Logging und Monitoring für Dateiübertragungen.
Fazit und praktische Anwendungsfälle
Der Einsatz von ssh2-sftp-client vereinfacht sichere Dateiübertragungen in
Node.js-Anwendungen. Dieser Ansatz eignet sich ideal für automatisierte Backups,
Datensynchronisation und den sicheren Dateiaustausch zwischen Systemen.
Für eine schlanke Lösung können Sie den 🤖 /sftp/store Robot von Transloadit als Teil unseres Dateiexport-Dienstes in Betracht ziehen.
