Linux 是否可以使用本地脚本将SSH连接到多个服务器(从本地到servA,然后从servA到servB)?

Linux 是否可以使用本地脚本将SSH连接到多个服务器(从本地到servA,然后从servA到servB)?,linux,bash,ssh,remote-server,Linux,Bash,Ssh,Remote Server,我有两个困难 问题1 我使用ssh登录到“servA”userA@servA从本地终端,然后从“servA”使用ssh登录到“servB”userB@servB和cd放入我在“servB”上的工作目录中,并执行“programA”(无法从本地连接servB)。每次我需要手动执行此过程并输入密码两次(一次用于servA,一次用于servB) 我可以通过在本地终端运行bash脚本来完成上面的过程吗 问题2 我想将数据从本地复制到servB,反之亦然。目前,我使用scp将数据从本地复制到servA,然

我有两个困难

问题1

我使用
ssh登录到“servA”userA@servA
从本地终端,然后从“servA”使用
ssh登录到“servB”userB@servB
和cd放入我在“servB”上的工作目录中,并执行“programA”(无法从本地连接servB)。每次我需要手动执行此过程并输入密码两次(一次用于servA,一次用于servB)

我可以通过在本地终端运行bash脚本来完成上面的过程吗

问题2


我想将数据从本地复制到servB,反之亦然。目前,我使用scp将数据从本地复制到servA,然后从servA复制到servB。有没有在本地和servB之间直接传输数据的解决方案?

对于ssh跃点,我使用了非常类似的方法:

ssh -A -t hopserver ssh -A finalserver
从。我创建了一个bash别名hop

alias hop="ssh -A -t hopserver ssh -A"
这样我就可以打字了

hop finalserver
您可以在.ssh/config中为每台机器设置访问详细信息,如果要跳过密码验证,您需要将ssh公钥放在每台涉及机器的.ssh/authorized_密钥中


希望能有所帮助。

对于ssh跃点,我使用了与此非常类似的东西:

ssh -A -t hopserver ssh -A finalserver
从。我创建了一个bash别名hop

alias hop="ssh -A -t hopserver ssh -A"
这样我就可以打字了

hop finalserver
您可以在.ssh/config中为每台机器设置访问详细信息,如果要跳过密码验证,您需要将ssh公钥放在每台涉及机器的.ssh/authorized_密钥中


希望有帮助。

最简单的方法是使用到servA的ssh连接来设置隧道:

ssh -L50022:servB:22 user@servA
然后,您可以通过访问localhost:50022连接到servB上的ssh守护程序,会话被转发或“隧道”到servB:

ssh -p 50022 user@localhost

您可以通过将其放入脚本来实现自动化。但是,您必须注意,第一次调用(设置隧道)不会阻止脚本:

ssh -T -L50022:servB:22 user@servA &
scp -P 50022 /some/local/file user@localhost:/home/user/

最简单的方法是使用到servA的ssh连接来设置隧道:

ssh -L50022:servB:22 user@servA
然后,您可以通过访问localhost:50022连接到servB上的ssh守护程序,会话被转发或“隧道”到servB:

ssh -p 50022 user@localhost

您可以通过将其放入脚本来实现自动化。但是,您必须注意,第一次调用(设置隧道)不会阻止脚本:

ssh -T -L50022:servB:22 user@servA &
scp -P 50022 /some/local/file user@localhost:/home/user/

~/.ssh/config
中,指定一个
ProxyCommand
,该命令使用
servA
连接到
servB

Host servB
    ProxyCommand ssh -W %h:%p userA@servA

然后
ssh-servB
将通过
servA
将您登录到
servB
%h
%p
采用原始命令中使用的主机和端口号,尽管这种情况不需要如此一般。

~/.ssh/config
中,指定一个
ProxyCommand
使用
servA
连接到
servB

Host servB
    ProxyCommand ssh -W %h:%p userA@servA


然后
ssh-servB
将通过
servA
将您登录到
servB
%h
%p
采用原始命令中使用的主机和端口号,尽管这种情况不需要如此一般。

您还没有解释ssh密钥不适用于您的原因。如果你不知道它们是什么,那就读ssh。@BruceK这把钥匙对我有用。我觉得单调的是每次都要输入密钥。我在这里找到了答案@Lee好问题!我曾经使用ssh和密钥解决过Q1,但对于Q2,我找不到简单的解决方案。。最后我分两步完成了。(尽管这两个步骤是在脚本中自动完成的)您还没有解释为什么ssh密钥不适合您。如果你不知道它们是什么,那就读ssh。@BruceK这把钥匙对我有用。我觉得单调的是每次都要输入密钥。我在这里找到了答案@Lee好问题!我曾经使用ssh和密钥解决过Q1,但对于Q2,我找不到简单的解决方案。。最后我分两步完成了。(虽然,这两个步骤是在脚本中自动完成的)哦,我不知道那一步!谢谢不过,我不确定这是否会像
scp
那样起作用,但它应该解决第一个问题。@arkascha我用您提供的内容创建了~/.ssh/config。但我得到了这个信息:伪终端将不会被分配,因为stdin不是终端。伪终端将不会被分配,因为stdin不是终端。对不起,如果我没有完全弄错的话,那么您在这里混淆了一些东西。。。这不是我的答案。修改使用后发现在哦,我不知道一个!谢谢不过,我不确定这是否会像
scp
那样起作用,但它应该解决第一个问题。@arkascha我用您提供的内容创建了~/.ssh/config。但我得到了这个信息:伪终端将不会被分配,因为stdin不是终端。伪终端将不会被分配,因为stdin不是终端。对不起,如果我没有完全弄错的话,那么您在这里混淆了一些东西。。。这不是我的答案。使用post进行修改。在SSH之间执行其他命令是否可行?e、 g.alias hop=“ssh-A-t servA;SCREEN;ssh-A servB”
$1
在定义别名时展开;它没有参数化它
hop finalserver
工作,因为定义
hop
时,
$1
未设置,“参数”别名只需添加到扩展到的文本中即可。感谢@chepner-我多年来一直使用该别名跳入vpn,但从未意识到它会产生副作用,而不是设计:)。我已编辑了参数以使其更清晰。果然alias-p显示在设置别名时参数被替换为零@Lee,当然应该可以执行其他命令,尽管我认为像screen这样的东西需要很多麻烦才能将终端连接到它上-如果你能够的话,可能值得在这个上面进行实验?在SSH之间执行其他命令可行吗?e、 g.alias hop=“ssh-A-t servA;SCREEN;ssh-A servB”
$1
在您