Ssh

如何區分 ~/.ssh/rc 中的 ssh 和 scp?

  • July 6, 2021

neofetch每次通過 OpenSSH 登錄遠端伺服器時,我都想啟動(一個顯示橫幅的小實用程序)。所以,我剛剛添加/usr/bin/neofetch到我的~/.ssh/rc文件中,它工作正常。問題是當我進入伺服器~/.ssh/rc時也會解析它。scp一個完整的scp命令可以正常工作,但是當我嘗試使用的自動完成功能時出現問題scp,當我鍵入時<Tab><Tab>,它會顯示遠端伺服器上可用的文件/文件夾,例如:

$ scp remote-host:/t <TAB><TAB>
\\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\`\\\"\\\"\\\"\\\  
\\\ \\\$\\\$\\\:\\\ \\\ \\\ \\\ \\\ \\\ \\\$\\\$.\\\ \\\ \\\ ^[\\\[0m^[\\\[31m^[\\\[1m-^[\\\[0m^[\\\[1m\\\ \\\ \\\ \\\ \\\,d\\\$\\\$\\\'\\\  
\\\ \\\ \\\ \\\ \\\ \\\`\\\$\\\$b.\\\  
\\\ \\\,\\\$\\\$P\\\'\\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\`\\\$\\\$\\\$.\\\  
\\\ \\\$\\\$P\\\ \\\ \\\ \\\ \\\ \\\ d\\\$\\\'\\\ \\\ \\\ \\\ \\\ ^[\\\[0m^[\\\[31m^[\\\[1m\\\,^[\\\[0m^[\\\[1m\\\ \\\ \\\ \\\ \\\$\\\$P\\\  
\\\'\\\,\\\$\\\$P\\\ \\\ \\\ \\\ \\\ \\\ \\\ \\\,ggs.\\\ \\\ \\\ \\\ \\\ \\\`\\\$\\\$b\\\:\\\  
\\\ \\\$\\\$\\\;\\\ \\\ \\\ \\\ \\\ \\\ Y\\\$b._\\\ \\\ \\\ _\\\,d\\\$P\\\'\\\  
^[\\\[0m^[\\\[1m\\\ \\\`\\\$\\\$b\\\ \\\ \\\ \\\ \\\ \\\ ^[\\\[0m^[\\\[31m^[\\\[1m\\\"-.__\\\  
^[\\\[0m^[\\\[1m\\\ \\\ \\\`Y\\\$\\\$\\\ 
(...)

通常向我顯示以(例如)$ scp remote-host:/t <TAB><TAB>開頭的文件/文件夾,但現在它執行橫幅。/t``/tmp``neofetch

有沒有辦法區分$ sshin $ scp~/.ssh/rcneofetch在我ssh進入伺服器時啟動,而不是在我scp進入伺服器時啟動)?

注意:我不想在每次啟動 bash 時啟動 neofetch,也不想在每次啟動登錄 shell 時啟動,因此不能將其放入/etc/bash.bashrc或放入/etc/profile。我只想在 SSH 連接後啟動它。

我做了一些研究並嘗試了一些事情:

if [ -t 0 ]; then /usr/bin/neofetch; fi

if tty > /dev/null; then /usr/bin/neofetch; fi

但它不起作用(neofetch從未啟動,即使在之後也不啟動$ ssh

  • 受那篇文章的啟發,我還嘗試使用$-環境變數來區分互動式和非互動式會話,但它也不起作用,因為~/.ssh/rc它是由破折號而不是 bash 解析的(並且$-是一個 bash 變數)

然而,我找到了一個可行的解決方案(嗯,有點……)。它的靈感來自這篇文章

  • 在伺服器上~/.ssh/rc,我輸入:

if [ ! "$LC_SCP" = "yes" ]; then /usr/bin/neofetch; fi

  • 在客戶端,我必須在LC_SCP之前設置一個環境變數$ scp
$ export LC_SCP=yes

$ scp -o SendEnv=LC_SCP remote-host:/t<TAB><TAB>
(works, doesn't launch neofetch)

它有效,但它很麻煩。難道沒有更好的方法來區分sshscp中的會話~/.ssh/rc嗎?

環境變數SSH_TTY似乎只在sshing 時設置,而不是在scping 時設置。所以以下就足夠了(至少在我的測試中):

if [ -n "$SSH_TTY" ]; then /usr/bin/neofetch; fi

(對於它的價值,我通過查看 的輸出猜到了這一點env | grep -i ssh。)

引用自:https://unix.stackexchange.com/questions/657250