![通过 ssh 在远程服务器上使用本地 LS_COLORS,而无需修改远程服务器](https://linux22.com/image/592478/%E9%80%9A%E8%BF%87%20ssh%20%E5%9C%A8%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0%20LS_COLORS%EF%BC%8C%E8%80%8C%E6%97%A0%E9%9C%80%E4%BF%AE%E6%94%B9%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我可以访问大量不同的 ssh 帐户,我想有几百个,我会在不同场合使用这些帐户。其中一些是个人帐户,一些是我从客户那里得到的,是共享的,还有很多是临时的。创建这些帐户仅供一次使用,一段时间后会自动删除。
现在我的问题是我使用了两个 .dircolors,一个是浅色主题,一个是深色主题。我非常喜欢这种设置,但这意味着每次我 ssh 进入服务器时都要复制一个新的 .dircolors,而且在共享帐户上有时会打扰其他人。我尝试修改我的 ssh 脚本以允许我使用本地 LS_COLORS,但遇到了一些问题。
如果我使用:
ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash --noprofile --norc'
它可以工作,但并不完全可用,因为它忽略了所有系统默认信息。
如果我使用:
ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash'
它不起作用,因为 bash 会经过 .profile 并加载不同的 LS_COLORS。
关于如何加载默认的 .bash_profile/.bashrc 并拥有我自己的 LS_COLORS,有什么建议吗?
答案1
创建一个文件,比如“prefs.rc”,并进行任意你喜欢的初始化。
$ scp prefs.rc vps2:/tmp/ && ssh vps2
# ssh banner
$ . /tmp/prefs.rc && rm /tmp/prefs.rc
我可能会添加一些检查来验证远程文件确实是我写的,并且不包含某些木马。最好谨慎一点。
或者,使用下列序列启动 prefs.rc
. /etc/profile
. ~/.bash_profile
exec LSCOLORS=...
使用scp
进行转移,然后:
ssh -t vps2 'exec bash --rcfile /tmp/prefs.rc'
最终,您可能需要复制 .bash_profile 的全部内容,然后替换该LS_COLORS=...
行。
答案2
这有效(客户端,无需任何服务器修改):
expect -c 'spawn ssh vps2 expect "~#" send "export LS_COLORS=\"no=00:fi=00:ETC_ETC_ETC_ETC:\"\r" interact'
当然,这远非最佳(因为它在 ssh 之后“输入”导出命令,从而导致延迟),任何更清晰的解决方案都非常受欢迎!:)
答案3
ssh -t vps2 ' cp ~/.bashrc ~/.bashrc.n &>/dev/null ; echo "LS_COLORS=\"no=00:fi=00:ETC:ETC:ETC\";" >> ~/.bashrc.n ; echo "export LS_COLORS" >> ~/.bashrc.n ; echo "alias ls=\"ls --color=auto\";" >> ~/.bashrc.n ; exec bash --rcfile ~/.bashrc.n'
这将无需先执行额外的 scp 即可工作,此处的额外连接延迟应该不存在。登录期间您不需要任何额外的命令,并且它将使用现有 shell 的设置,除了我的覆盖之外。它不会像 expect 那样破坏终端大小调整 :)
我实际上还添加了 PS1 和带有颜色的 grep/egrep 别名,但为了便于阅读,上面的示例代码没有添加它。