scp sul server remoto con sudo


65

Ho un file sul server A (che è dietro un NAT quindi non indirizzabile direttamente). Il file deve essere copiato sul server B in una directory limitata a root. Ho un account sul server B con privilegi sudo. Qual è la sintassi per il comando scp?



ho chiuso la domanda precedente come duplicata di questa, poiché la domanda non ha mai riguadagnato la proprietà di quella domanda.
— Quack Quixote

Ho risposto ad un altro post su come personalizzare SCP facendo il sudo direttamente per te. Questo è simile a quello che fa WinSCP.
— YoYo

Risposte:


58

Innanzitutto, devi copiare il file in un posto in cui hai accesso in scrittura senza sudo,

scp yourfile serverb:

Quindi spostare il file utilizzando sudo

ssh serverb sudo mv yourfile /path/to/the/destination

Se non si dispone di un luogo scrivibile, creare una directory temporanea con autorizzazione di scrittura per l'utente.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination

7
/ tmp è un buon posto per scrivere file temporanei a cui (di solito) tutti gli utenti hanno accesso.
— Doug Harris,

3
@Doug: Nota che / tmp potrebbe trovarsi nella RAM o nel punto / mount, e non necessariamente abbastanza grande per ospitare file di grandi dimensioni.
— Ravachol,

2
Qualunque cosa tu stia cercando di realizzare, di chmod 777solito è il modo sbagliato di farlo. Considera cosa potrebbe accadere se qualcun altro avesse effettuato l'accesso e sapesse che avresti eseguito questo codice.
— Tripleee,

1
ssh sudonon funziona per me - si lamenta "nessun regalo presente e nessun programma askpass specificato"?
— Ross Presser,

1
@RossPresser mi scuso per la risposta tardiva, ma è necessario impostare sudo senza password serverbo è necessario ssh serverbseparatamente, quindi eseguire sudo ...dopo aver effettuato l'accesso.
— Johan

49

Con SCP, devi fare in due passaggi, tuttavia, puoi farlo in uno con rsync come segue:

rsync --rsync-path="sudo rsync" <LOCALFILE> USER@SERVER2:/root

Nota: questo richiede una NOPASSWDconfigurazione sudo. Se devi inserire la password per sudo, è necessario il modo in due passaggi.

Per copiare la directory, è necessario aggiungere un -rparametro. E -vper un output dettagliato.


Per utilizzare il metodo sopra con le credenziali, è necessario aggiungerle al ~/.ssh/configfile, ad es

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem

5
Questo è di gran lunga il modo più semplice per farlo.
— Matt White,

Errore sudo: sorry, you must have a tty to run sudorisolto da -e "ssh -tt".
— mj41,

@ mj41 Con -e "ssh -tt", capisco protocol version mismatch -- is your shell clean?. Qualche suggerimento su come risolverlo?
— ax.

19

Puoi usare ssh e tar per aggirare questo:

ssh -t host 'sudo -v'
ssh -C host 'cd /; sudo tar cf - path/to/file/or/dir' | tar xpsf - --preserve

Questo prima aggiorna il tuo timestamp sudo (chiedendo una password se necessario, che richiede un tty ( ssh -t)), quindi usa sudo per creare un tarball da remoto ed estrarlo localmente.

"tar" su RedHat 5 richiede che le opzioni "--preserve" vengano dopo il comando "xpsf -".


Solo una nota: se ottieni tar: Invalid replacement string, la rimozione -sin sembra risolverlo (non sono sicuro di cosa ti serva scomunque). Grazie molto; Questo e spettacolare.
— Ricorsivamente, il

Ciò richiederebbe tty_ticketsdi essere disabilitato, giusto?
— Jacob Budin,

@JacobBudin sì.
— blueyed

4

Puoi usare sftp con il comando sudo, ad esempio:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST

Questo e i metodi rsync sono probabilmente il modo più diretto per farlo in un solo passaggio. È un peccato che l'attività SCP nella formica non la supporti. Puoi impostarlo per usare sftp, ma non puoi modificare il sottoprogramma remoto. Si noti che il sottoprogramma sarà diverso a seconda del tipo di server (Solaris potrebbe essere diverso).
— YoYo

0

Se è necessario digitare la password per sudo ogni volta, è possibile salvarla in un file:

echo "Enter password: "; read -s password; echo $password > password_file

e quindi inviarlo insieme al file di origine.

cat password_file source_file | ssh remote_host 'sudo -S sponge target_file'

Puoi usare teeinvece di spongese non hai moreutils.


0

Innanzitutto, è necessario copiare il file in un posto in cui si dispone dell'accesso in scrittura senza sudo. È possibile eseguire i due passaggi seguenti.

Passo 1: scp filename newserver

Passo 2: ssh newserver sudo mv filename /path/to/the/destination

per maggiori informazioni leggi il tutorial di scp


-1
current server $ sudo scp username@server:source/path/filename /tmp/

Copia il file specifico dall'origine a / tmp / nel server corrente


Eseguirà il sudo localmente, non offrendoti privilegi elevati da remoto.
— YoYo

Questo non funzionerà, come dice @Yoyo.
— Mani

scp probabilmente non si collegherà, perché leggerà la chiave di root
— Pierre-Olivier Vares,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.