如何在~/.ssh/rc中区分ssh和scp?

如何在~/.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/tmpneofetch

有没有办法区分$ ssh(仅当我进入服务器时启动,而不是在我进入服务器时$ scp启动)?~/.ssh/rcneofetchsshscp

注意:我不想每次启动 bash 时都启动 neofetch,也不想每次启动登录 shell 时都启动 neofetch,所以将其放入/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吗?

答案1

环境变量SSH_TTY好像只有在sshing时设置,而不是在scping时设置。所以以下内容就足够了(至少在我的测试中):

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

(对于它的价值,我通过查看 的输出来猜测这一点env | grep -i ssh。)

相关内容