Trasferisci una directory su ssh con sudo

Oct 15 2020

Sto cercando di trasferire una directory da un server remoto (CentOS) alla mia macchina locale (Ubuntu) tramite ssh. Ci sono due utenti: A e B. L'utente A può ssh nel server remoto e ha accesso sudo. L'utente B possiede una directory nel server remoto.

Per trasferire una directory di proprietà dell'utente B come utente A, è necessario utilizzare sudo.

Attualmente per trasferire un file (da remoto a locale) questo è quello che sto usando:

ssh -tt userA@remote_host 'stty raw -echo; sudo cat /path/to/remote/file/owned/by/userB' > /path/to/local/file

Per trasferire una directory ho provato l'approccio tar,

ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | tar -C /path/lo/local/directory -xzf -

Tuttavia sul sistema locale ottengo questo errore:

gzip: stdin: not in gzip format
tar: Child returned status 1
tar: Error is not recoverable: exiting now

Che cosa sto facendo di sbagliato?

Risposte

SaurabhPBhandari Oct 16 2020 at 03:13

Tenta di trasferire la directory usando ssh

ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | tar -C /path/lo/local/directory -xzf -

Piping l'output del comando precedente a cat (nel sistema locale) invece di tar, fornisce ulteriori informazioni:

$ ssh -tt userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -czf - .' | cat
userA@remote_host's password: 
gzip: compressed data not written to a terminal. Use -f to force compression.
For help, type: gzip -h
Connection to remote_host closed.

Per risolvere questo problema, ho usato questo comando:

ssh -t userA@remote_host 'stty raw -echo; sudo tar -C /path/to/remote/directory/owned/by/userB/ -cf - . | gzip -9nf' | tar -C  /path/lo/local/directory -xzf -

Nota per le opzioni ssh

Dato che sto usando sudoper accedere alla directory dell'utente B, sshrestituisce sudo: sorry, you must have a tty to run sudose l' -topzione non è usata.

-t : Forza l'allocazione pseudo-terminale

Nota per le opzioni stty

L' sttyopzione -echoè facoltativa. Deve essere utilizzato (credo) se sudorichiede di inserire la password.

raw : Elabora l'input così com'è (non interpreta caratteri speciali, ecc.)

-echo : Non stampa i caratteri digitati

Nota per le opzioni gzip

-9 : Imposta la compressione al massimo

-f: Forza la compressione ( come suggerito dall'errore )

-n, --no-name: Non include nome e timestamp del file (utile per confrontare i checksum del file in remoto e locale)