Назад | Перейти на главную страницу

MOTD, созданный пользователем, предотвращает работу SCP

Я создал пользовательские MOTD, которые будут отображаться при входе в систему через SSH, выполнив следующие действия:

  1. создать текстовый файл в /etc/usermotd/<username> с сообщением внутри
  2. Отредактируйте файл пользователя .bashrc и поместите следующий код:
if [ -f /etc/usermotd/`whoami` ]; then
cat /etc/usermotd/<username>;
fi

Он работает так, как я хочу. Тем не мение...

Я только что обнаружил, что когда я пытаюсь что-то SCP, это не работает. Я выполняю команду scp, и она завершается, не показывая какой-либо индикатора выполнения и не сообщая, что он был перенесен. Когда я выполняю scp -vvv, я получаю

debug1: Authentication succeeded (publickey).
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: channel 0: new [client-session]
debug3: ssh_session2_open: channel_new: 0
debug2: channel 0: send open
debug1: Requesting no-more-sessions@openssh.com
debug1: Entering interactive session.
debug2: callback start
debug2: client_session2_setup: id 0
debug1: Sending command: scp -v -t ~
debug2: channel 0: request exec confirm 1
debug2: fd 3 setting TCP_NODELAY
debug2: callback done
debug2: channel 0: open confirm rwindow 0 rmax 32768
debug2: channel 0: rcvd adjust 2097152
debug2: channel_input_status_confirm: type 99 id 0
debug2: exec request accepted on channel 0

WELCOME
debug2: channel 0: read<=0 rfd 4 len 0
debug2: channel 0: read failed
debug2: channel 0: close_read
debug2: channel 0: input open -> drain
debug2: channel 0: ibuf empty
debug2: channel 0: send eof
debug2: channel 0: input drain -> closed
BigBoss ~/.ssh:-$ debug1: client_input_channel_req: channel 0 rtype exit-status reply 0
debug2: channel 0: rcvd eof
debug2: channel 0: output open -> drain
debug2: channel 0: obuf empty
debug2: channel 0: close_write
debug2: channel 0: output drain -> closed
debug2: channel 0: rcvd close
debug3: channel 0: will not send data after close
debug2: channel 0: almost dead
debug2: channel 0: gc: notify user
debug2: channel 0: gc: user detached
debug2: channel 0: send close
debug2: channel 0: is dead
debug2: channel 0: garbage collecting
debug1: channel 0: free: client-session, nchannels 1
debug3: channel 0: status: The following connections are open:
  #0 client-session (t4 r0 i3/0 o3/0 fd -1/-1 cfd -1)

debug3: channel 0: close_fds r -1 w -1 e 6 c -1 
debug1: fd 0 clearing O_NONBLOCK
debug1: fd 1 clearing O_NONBLOCK 
Transferred: sent 2208, received 3352 bytes, in 0.2 seconds
Bytes per second: sent 13207.5, received 20050.5
debug1: Exit status 0

Любые идеи, почему он не отправляется? Или есть другой способ сделать это?

Это не сработает, потому что scp ожидает, что удаленная сторона будет вести себя именно так, а не кричать ей ДОБРО ПОЖАЛОВАТЬ. (Это бы было бы хорошо, если бы это выдало сообщение об ошибке, но ...).

Использовать sftp (который вообще не создает оболочку входа в систему) вместо scp или иметь свой .bashrc определить, находится ли он в интерактивном сеансе или нет. Кажется, есть несколько способов сделать это:

if [ -n "$PS1" ]; then
  echo WELCOME
fi;

Другой приведенный там метод проверки наличия в "$ -" "i", по-видимому, не работает, поскольку [ не делает * при сравнении строк. Это должно сработать (он проверяет, установлен ли $ -, затем проверяет, совпадает ли $ - с удаленным "i" с $ -. Вероятно, есть способ получше, но я не могу придумать его на втором этапе. )

if [ -n "$-" -a "${-/i}" != "$-" ]; then
  echo WELCOME
fi; 

Вы не можете генерировать вывод терминала, если хотите, чтобы scp работал правильно. Что вам нужно сделать, так это заключить в скобки любой материал, генерирующий вывод в моем случае, .cshrc, следующим образом:

 if ($?prompt != 0) then
      cat /etc/motd
      endif

Таким образом, вы генерируете вывод только в том случае, если есть терминал для его получения (т.е. логин ssh).