how - SCP no funciona cuando echo en.bashrc?
scp unix (8)
Tengo dos usuarios en Fedora:
- Wani
- root (¡bastante obvio!)
Mis contenidos de .bashrc del usuario Wani son:
# .bashrc
echo "Hello"
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
Ahora, después de iniciar sesión en root, escribo los siguientes comandos:
[root@Dell Wani]# touch try.txt
[root@Dell Wani]# service sshd start
[root@Dell Wani]# scp try.txt Wani@localhost:~/
Wani@localhost''s password:
Hello
[root@Dell Wani]#
Ahora inicio sesión en Wani y escribo:
[Wani@Dell ~]$ cat try.txt
cat: try.txt: No such file or directory
[Wani@Dell ~]$
Ahora vuelvo a iniciar sesión en root y escribo el mismo comando con -v
:
[root@Dell Wani]# scp -v morph.log Wani@localhost:
Executing: program /usr/bin/ssh host localhost, user Wani, command scp -v -t -- .
OpenSSH_5.6p1, OpenSSL 1.0.0j-fips 10 May 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: permanently_set_uid: 0/0
debug1: identity file /root/.ssh/id_rsa type -1
debug1: identity file /root/.ssh/id_rsa-cert type -1
debug1: identity file /root/.ssh/id_dsa type -1
debug1: identity file /root/.ssh/id_dsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.6
debug1: match: OpenSSH_5.6 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host ''localhost'' is known and matches the RSA host key.
debug1: Found key in /root/.ssh/known_hosts:2
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi- with-mic,password
debug1: Next authentication method: gssapi-keyex
debug1: No valid Key exchange context
debug1: Next authentication method: gssapi-with-mic
debug1: Unspecified GSS failure. Minor code may provide more information
Credentials cache file ''/tmp/krb5cc_0'' not found
debug1: Unspecified GSS failure. Minor code may provide more information
Credentials cache file ''/tmp/krb5cc_0'' not found
debug1: Unspecified GSS failure. Minor code may provide more information
debug1: Unspecified GSS failure. Minor code may provide more information
debug1: Next authentication method: publickey
debug1: Trying private key: /root/.ssh/id_rsa
debug1: Trying private key: /root/.ssh/id_dsa
debug1: Next authentication method: password
Wani@localhost''s password:
debug1: Authentication succeeded (password).
Authenticated to localhost ([127.0.0.1]:22).
debug1: channel 0: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env XMODIFIERS = @im=none
debug1: Sending env LANG = en_US.UTF-8
debug1: Sending command: scp -v -t -- .
Hello
[root@Dell Wani]# debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug1: channel 0: free: client-session, nchannels 1
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK
Transferred: sent 1664, received 1976 bytes, in 0.1 seconds
Bytes per second: sent 22961.5, received 27266.8
debug1: Exit status 0
(Y después de presionar Enter)
[root@Dell Wani]#
¿Puede alguien por favor arrojar algo de luz sobre lo que sucedió exactamente aquí? ¿Por qué el archivo no se copió de la raíz de Wani?
El Ubuntu .bashrc
predeterminado contiene el siguiente fragmento que ya soluciona el problema:
# If not running interactively, don''t do anything
case $- in
*i*) ;;
*) return;;
esac
El uso de echo
en a .bashrc
romperá scp
, ya que scp
espera ver sus datos de protocolo a través de los canales stdin / stdout. Consulte https://bugzilla.redhat.com/show_bug.cgi?id=20527 para obtener más información sobre este tema.
Hay algunas soluciones disponibles:
- Condición en la bandera ''interactiva'' (por ejemplo,
case $- in *i*
según lo sugerido por tripleee) - Utilice la utilidad
tty
para detectar un shell interactivo (por ejemplo,if tty > /dev/null
oif [ -t 0 ]
) - Verifique el valor de
$SSH_TTY
Supongo que deberías usar el que te funcione. No sé cuál es la mejor opción (la más portátil / más confiable), desafortunadamente.
En .bashrc
, use STDERR como salida en su lugar:
echo "# Important Notice" >&2
Actualización: ¡no lo use! Hace poco tuvimos un problema que una herramienta (de fuente cerrada) falló debido a un echo
de STDERR en .bashrc
. La herramienta (usando rcp
) no esperaba salida alguna, ni en STDOUT ni STDERR. Y se estancó cuando obtuvo el eco. Lección aprendida: hacer cuentas separadas para humanos y para máquinas (scripts), o simplemente dejar de insultar a través de .bashrc
.
Esto funciona para mí,
En .bashrc
agregue la primera línea como:
if [ -z "$PS1" ]; then
return
fi
https://superuser.com/questions/690735/can-i-tell-if-im-in-an-scp-session-in-my-bashrc
La forma más portátil de probar un shell interactivo parece ser:
test -t 0
if [ $? -eq 0 ]
then
# interactive
;
else
# non-interactive
;
fi
La solución de nneonneo funcionó también para mí. Pero como mi shell predeterminado es TCSH, tuve que editar ligeramente la corrección de la siguiente manera (en .tcshrc):
if ( $?SSH_TTY ) then
exec /bin/bash
endif
Solo pensé que compartiría para el beneficio de todos.
Para agregar a las opciones de nneonneo, también puede acondicionar con la bandera interactiva con
if [[ $- =~ "i" ]]
que creo que es posiblemente el camino más claro en bash.
if [ 0 -eq $(shopt -q login_shell; echo $?) ]; then
echo "do something?"
fi