让 bash 脚本执行 ssh

让 bash 脚本执行 ssh

我想要一个 bash 脚本来在多个新的 bash 窗口中启动与多个 linux 服务器的多个 SSH 连接,不进行进一步处理,只使用一个简单的命令进行连接,而不必每次重新启动 bash(使用 WSL2/WSLg)时都输入完整的 ssh 行。

打开新终端并在其中执行命令完全没有问题。在这三种情况下,仅运行 ssh (openSSH) 都是有问题的,因为它们都会引发相同的错误:'ad port ' 12345

在 bash 中手动执行它会像这样调用 ssh:ssh[电子邮件保护]-p 12345

因此我假设,就像每个命令一样,我可以按照以下方式编写脚本:

#!/bin/bash
ssh [email protected] -p 12345
ssh [email protected] -p 67890
ssh [email protected] -p 54321

这是与脚本相关的问题吗?或者可能是 WSL 问题?

编辑:我想指出的是,我现在主要关注的是“广告端口”错误。我不知道这是什么,在 Inet 上也找不到任何有用的信息。

EDIT2:这只是代码的过度简化,因为我不允许分享整个脚本的任何细节。我知道,此代码将按顺序执行 ssh,但无论如何这仅用于测试。我只想查看按顺序建立的三个连接(登录由 RSA 密钥对处理)。

整个脚本都是使用 NANO 或 VIM 在 Proxmox->Debian 服务器(在 Proxmox 上运行的虚拟 Debian)上编写的。因此,遗憾的是 CRLF 行尾不是问题所在。不过,感谢您指出这一点!

该问题并未直接解决,但可以采用另一种方法解决 - 使用 tmux - 正如@NotTheDr01ds 所建议的那样!

答案1

这很可能是由于在视窗编辑器,使用 DOS/Windows CRLF 行尾保存。如果我使用 创建脚本,也会遇到同样的错误notepad.exe。记事本现在以 Unix/Linux 格式保存,但除非您手动更改该选项,否则它不会默认保存新文件。

一般来说,总是使用 Linux 工具编辑 WSL 内部的文件。

在多个新的 bwindow 中

您的脚本尚未尝试解决此问题。正如评论中所述,当前脚本将在单个bash实例(脚本的 shebang 行本身的子 shell)中按顺序运行这些。

如果要将每个程序启动到单独的“窗口”,则需要一些提供此功能的工具。该wsl.exe命令本身不是一个很好的选择,因为默认情况下,它将执行一个新实例里面当前终端。它是可能的使用 PowerShell(甚至在 WSL 内部)和Start-Processcmdlet 启动新的 WSL 窗口/终端:

从 WSL:

powershell.exe -c Start-Process wsl.exe

可以wsl.exe与的参数结合-e/--execute来启动ssh命令:

#!/bin/bash
powershell.exe -c 'Start-Process "wsl.exe" -ArgumentList "ssh [email protected] -p 12345"'
powershell.exe -c 'Start-Process "wsl.exe" -ArgumentList "ssh [email protected] -p 67890"'
powershell.exe -c 'Start-Process "wsl.exe" -ArgumentList "ssh [email protected] -p 54321"'

但我建议使用 Tmux。它默认安装在 WSL Ubuntu 发行版中:

#!/bin/bash
tmux new-session sh -c "ssh [email protected] -p 12345; exec bash" \; new-window sh -c "ssh [email protected] -p 67890; exec bash" \; new-window sh -c "ssh [email protected] -p 54321; exec bash"

这将ssh在 3 个不同的 Tmux 窗口中运行您的命令,然后在每个窗口中启动 bash shell,以便您可以查看结果。如果您还不了解 Tmux,您需要学习一些热键才能切换窗口等。

当然,还有其他方法可以做到这一点。

相关内容