如何區分 ~/.ssh/rc 中的 ssh 和 scp?
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
有沒有辦法區分
$ ssh
in$ scp
(~/.ssh/rc
僅neofetch
在我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)
它有效,但它很麻煩。難道沒有更好的方法來區分
ssh
和scp
中的會話~/.ssh/rc
嗎?
環境變數
SSH_TTY
似乎只在ssh
ing 時設置,而不是在scp
ing 時設置。所以以下就足夠了(至少在我的測試中):if [ -n "$SSH_TTY" ]; then /usr/bin/neofetch; fi
(對於它的價值,我通過查看 的輸出猜到了這一點
env | grep -i ssh
。)