AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 476107
Accepted
Matteo Italia
Matteo Italia
Asked: 2018-10-18 11:57:48 +0800 CST2018-10-18 11:57:48 +0800 CST 2018-10-18 11:57:48 +0800 CST

如何在安装了fish的远程服务器上使用fish而不更改登录shell?

  • 772

我经常ssh在几个不同的服务器上,其中一些没有fish安装,但很多都安装了。如果可用,我想获得fishshell(中途更改总是很乏味,并且您会丢失已键入内容的历史记录),但是更改默认 shell 不是一个好主意,因为:

  • 我需要更换许多不同的机器;
  • 在许多其他上,我通过 LDAP 登录,并且更改存储在 LDAP 上的 shell 会在fish不可用的机器上中断;
  • 一般来说,由于fish不兼容 POSIX-sh,将其作为默认 shell 可能会破坏脚本执行的命令ssh;
  • 最后,有几台机器的用户与其他人共享(或者,我必须登录另一个用户),所以更改默认 shell 不是一个好主意。

因此,理想情况下,我希望有这样的命令在可用时ssh自动启动fish,或者只保留提供的任何默认 shell。

shell ssh
  • 2 2 个回答
  • 2464 Views

2 个回答

  • Voted
  1. Best Answer
    Matteo Italia
    2018-10-18T11:57:48+08:002018-10-18T11:57:48+08:00

    经过一些实验,我整理了fissh脚本:

    #!/bin/sh
    ssh "$@" -t "sh -c 'if which fish >/dev/null ; then exec fish -li; else exec \$SHELL -li; fi'"
    
    • "$@"转发传递给的所有参数ssh
    • -t强制分配 tty(否则ssh在指定命令时默认为无 tty)
    • sh -c是必需的,因为我们不知道另一端可能有什么外壳 - 在我的个人机器上,我确实有fish默认外壳,这会因不同的if语法而中断;
    • which fish如果找到可执行文件则成功fish;在这种情况下,它是exec-ed (要求交互式和登录 shell);
    • 否则,我们回退到$SHELL,这是当前用户的默认 shell($被转义,否则它会被sh“在这一边”扩展)。

    -li在任何一种情况下都通过,以确保我们实际上获得了一个登录的交互式shell。虽然-iPOSIX 强制要求任何外壳,-l但“只是”一个常见的扩展,但不将其放入可能会导致不好的意外。

    请注意,stdoutofwhich是隐藏的(在正常情况下,我们不关心在哪里fish找到),但是stderr(在找不到的错误消息的位置fish)故意保持不变,作为对用户的警告,尽管我们最好意图,fish找不到。

    为了完成体验,在我的机器上,fish我通过创建一个~/.config/fish/completions/fissh.fish包含自定义完成的文件来添加对自定义完成的支持

    complete -c fissh -w ssh
    

    指示fish具有fissh与ssh.

    • 2
  2. glenn jackman
    2018-10-18T14:58:13+08:002018-10-18T14:58:13+08:00

    我认为这个(未经测试的)小期望脚本会做同样的事情:

    #!/usr/bin/expect -f
    spawn ssh {*}$argv
    expect {
        {yes/no}   {send "yes\r"; exp_continue}
        -re {\$ $} {send "which fish >/dev/null && exec fish -li\r"}
    }
    interact
    

    假设:

    • 您的登录 shell 类似于 bourne,并且可以理解“cmd1 && cmd2”,
    • 您无需提供密码即可登录,
    • 您的提示以美元符号和空格结尾。
    • 0

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve