Я создал пользовательские MOTD, которые будут отображаться при входе в систему через SSH, выполнив следующие действия:
/etc/usermotd/<username>
с сообщением внутри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).