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.