我使用的fish
是shell,ssh
快捷方式功能如下:
function sshec2
ssh -i $HOME/.ssh/key.pem -t -t "ubuntu@$argv[1]"
end
为了 ssh 到特定的 AWS EC2 实例,我编写了命令管道流:
ec2-describe-instances --region us-west-2 --filter "tag:Name=test-box" |
grep 'INSTANCE' |
grep -E -m 1 -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'|
head -1 |
sshec2
但是,我收到错误ssh: connect to host port 22: Connection refused
,而sshec2
函数在运行时有效sshec2 <ec2_public_ip>
。
我错过了什么愚蠢的部分吗?
答案1
如果我理解正确的话,您有一个生成主机名列表 ( ec2-describe-instances … | grep … | grep …
) 的管道,您采用第一行 ( head -1
),并且您希望将其用作要连接的主机名。您在函数的标准输入上传递主机名sshec2
,并在不带参数的情况下调用该函数。因此,当函数执行时,$argv[1]
为空,并且最终会ssh
使用参数-i
, /home/dearrrfish/.ssh/key.pem
, -t
, -t
,运行ubuntu@
。如果您最终得到了有效的ssh
命令行并且连接确实通过,那么… | head -1
管道的输出将通过管道传输到运行的程序中ssh
。
您需要将主机名作为第一个参数传递给函数。这样做的工具是命令替换。
sshec2 (ec2-describe-instances --region us-west-2 --filter "tag:Name=test-box" |
grep 'INSTANCE' |
grep -E -m 1 -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' |
head -1)