scp al servidor remoto con sudo

65

Tengo un archivo en el servidor A (que está detrás de un NAT, por lo que no es directamente direccionable). El archivo debe copiarse en el servidor B en un directorio restringido a root. Tengo una cuenta en el servidor B con privilegios de sudo. ¿Cuál es la sintaxis para el comando scp?

Neil
fuente
He cerrado la pregunta anterior como un duplicado de esta, ya que el autor de la pregunta nunca recuperó la propiedad de esa pregunta.
quack quijote
He respondido en otra publicación cómo puede personalizar scp hacer el sudo directamente por usted. Esto es similar a lo que hace WinSCP.
YoYo

Respuestas:

58

Primero, debe copiar el archivo en un lugar donde tenga acceso de escritura sin sudo,

scp yourfile serverb:

Luego mueva el archivo usando sudo

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

Si no tiene un lugar de escritura, cree un directorio temporal con permiso de escritura para su usuario.

ssh serverb sudo mkdir tempdir && sudo chmod 777 tempdir
scp yourfile serverb:tempdir
ssh serverb mv tempdir/yourfile /path/to/the/destination
Johan
fuente
77
/ tmp es un buen lugar para escribir archivos temporales a los que (generalmente) tienen acceso todos los usuarios.
Doug Harris,
3
@Doug: Tenga en cuenta que / tmp podría estar en RAM o en / punto de montaje, y no necesariamente lo suficientemente grande como para alojar archivos grandes.
Ravachol
2
Lo que sea que intente lograr, chmod 777generalmente es la forma incorrecta de hacerlo. Considere lo que podría suceder si alguien más iniciara sesión y supiera que está a punto de ejecutar este código.
tripleee
1
ssh sudono funciona para mí, se queja de "no hay tty presente y no se ha especificado el programa askpass"?
Ross Presser
1
@RossPresser, perdón por la respuesta tardía, pero debe configurar sudo sin contraseña serverbo debe hacerlo por ssh serverbseparado, luego ejecutar sudo ...después de iniciar sesión.
Johan
49

Con SCP, debe hacerlo en dos pasos, sin embargo, puede hacerlo en uno con rsync de la siguiente manera:

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

Nota: Esto requiere la NOPASSWDconfiguración de sudo. Si tiene que ingresar la contraseña para sudo, entonces se necesitan los dos pasos.

Para copiar el directorio, debe agregar el -rparámetro. Y -vpara salida detallada.


Para utilizar el método anterior con credenciales, debe agregarlas a su ~/.ssh/configarchivo, por ejemplo

Host SERVER2
  HostName server2.example.colm
  User USER
  #IdentityFile ~/.ssh/custom_key.pem
MasterCheffinator
fuente
55
Esta es, con mucho, la forma más sencilla de hacerlo.
Matt White
Error sudo: sorry, you must have a tty to run sudoarreglado por -e "ssh -tt".
mj41
@ mj41 Con -e "ssh -tt", entiendo protocol version mismatch -- is your shell clean?. ¿Alguna pista sobre cómo solucionar eso?
hacha
19

Puede usar ssh y tar para solucionar esto:

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

Esto primero actualiza su marca de tiempo de sudo (solicitando una contraseña si es necesario, lo que requiere un tty ( ssh -t)), y luego usa sudo para crear un tarball de forma remota y extraerlo localmente.

"tar" en RedHat 5 requiere que las opciones "- preservar" vengan después del comando "xpsf -".

azulado
fuente
Solo una nota: si lo consigues tar: Invalid replacement string, eliminarlo -sparece solucionarlo ( sde todos modos, no estoy seguro de para qué lo necesitas ). Muchas gracias; Esto es asombroso.
RecursivelyIronic
Esto requeriría tty_ticketsser deshabilitado, ¿correcto?
Jacob Budin
@JacobBudin sí.
azulada el
4

Puede usar sftp con el comando sudo, por ejemplo:

sftp -s 'sudo -u REMOTE_SUDO_USER /usr/libexec/openssh/sftp-server' REMOTE_USER@HOST
DaniloNC
fuente
Este y los métodos rsync son probablemente la forma más directa de hacerlo en un solo paso. Es lamentable que la tarea scp en hormiga no lo soporte. Puede configurarlo para usar sftp, pero no puede modificar el subprograma remoto. Tenga en cuenta que el subprograma será diferente según el tipo de servidor (solaris puede ser diferente).
YoYo
0

Si necesita escribir la contraseña para sudo cada vez, puede guardarla en un archivo:

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

y luego envíelo junto con el archivo fuente.

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

Puede usar en teelugar de spongesi no tiene másutils.

Jan Tojnar
fuente
0

Primero, debe copiar el archivo en un lugar donde tenga acceso de escritura sin sudo. Puede realizar los siguientes dos pasos.

Paso 1: scp filename newserver

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

para más información lea el tutorial scp

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

Copiará un archivo específico desde la fuente a / tmp / en el servidor actual

Kumar
fuente
Ejecutará el sudo localmente, sin otorgarle privilegios elevados de forma remota.
YoYo
Esto simplemente no funcionará, como dice @Yoyo.
Mani
scp probablemente no se conectará, porque leerá la clave de la raíz
Pierre-Olivier Vares