2011-08-15 11 views
8

Quiero usar rsync en mi servidor remoto para el que tengo acceso SSH. Yo uso el siguiente comando:rsync sale con el mensaje "stdin no es un tty"

rsync -e 'ssh -p 22222' -rtz --delete CONTENT_DIR/[email protected]:/home/usuario/public_html

Después de introducir el comando , solicita la contraseña para la ubicación remota. Cuando lo escribo, que sale con el mensaje,

entrada estándar: no es una tty

¿Cómo proporcionar la contraseña a rsync? El método sugerido también debería funcionar cuando lo uso en un script de shell.

+0

Aparentemente hace lo que se supone que debe hacer. La transferencia de archivos se realizó con éxito. Pero, ¿cuál es el mensaje de error y debería preocuparme por ello? –

Respuesta

2

Se acepta la contraseña , ya que usted mismo ha declarado que la operación se realiza. El mensaje de error "stdin: no es un tty" se debe a algo en el script de inicio en su servidor que intenta procesar una acción que solo debería ocurrir para los inicios de sesión interactivos (cuando se conecta con ssh directo al servidor, etc.)

18

es necesario agregar:

[-z "$ PS1"] & & retorno

a la beginig de .bashrc que se encuentra en su directorio personal.

+2

¿Puedes explicarme qué hace esto en realidad? ¿Qué hace [-z "$ PS1"]? – rooby

+1

@rooby, ese comando comprueba si el shell se ejecuta de forma interactiva. Si es así, sale inmediatamente. Esto tiene sentido ya que las cosas en el archivo de configuración bash no son necesarias para procesos no interactivos, como rsync. –

1

[ -z "$PS1" ] && return resuelve el problema pero comprueba si la longitud de la cadena de solicitud es igual a cero y si lo hace, entonces se cierra. Aunque $ PS1 no se configurará en un shell no interactivo, $ PS1 es de longitud cero y no significa que el shell no sea interactivo.

Mejor enfoque es verificar las opciones actuales de la carcasa usando $-. Por ejemplo [[ $- != *i* ]] && return.

0

En el caso de un simple return no hace el trabajo, aquí hay otro enfoque tomado de this blog article:

if `tty -s`; then 
mesg n 
fi 
  • tty -s comprueba si hay un teléfono de texto adjunto (el -s dice que lo haga en silencio y simplemente salir con el código de retorno apropiado). tty devuelve el tty adjunto (por ejemplo, "/ dev/pts/1"). Esto debería ser más seguro que verificar alguna variable de shell;)
  • mesg controla el acceso de escritura a su terminal (msg n no permite escribir en el terminal (en nuestro caso no existente)), y por lo tanto requiere que haya uno presente.

En algunos sistemas (en mi caso Debian Jessie, pero hay informes también en Ubuntu) mesg n se pone incondicionalmente, ya sea en ~/.bashrc o ~/.profile. Entonces, si existe de esa manera, este podría ser el culpable.

Al igual que en los otros ejemplos, puede hacer que sea un trazador de líneas: [[ $(tty -s) ]] && mesg n. Y nadie le impide la combinación de los dos:

if [[ $(tty -s) ]]; then 
    mesg n 
else 
    return 
fi 

BTW: De acuerdo con el artículo enlazado, este fragmento debe ir a la .bashrc de la máquina se conecta a (la "distancia") - así que si eso es [email protected] , esto se debe aplicar al inicio de /home/johndoe/.bashrc en somehost. En mi caso, solo me deshice del mensaje después de haber aplicado este cambio también en el "host que llama".

PD: También verifique el .profile si tiene un comando independiente msg n (lo hizo en mi caso). Si lo hace, envuélvalo allí.


1:mesg n se utiliza para evitar que otros usuarios de la máquina de la escritura en el dispositivo terminal actual, que de por sí es una buena cosa - pero no es útil para algunos rsync trabajo;)