如何在bash_profile中编写函数

3
如何编写一个简单的正则函数,可以将其放入我的bash profile中,以便在任何我想要的主机上使用它来保护控制台。但是我的安全控制台必须通过跳板主机进行访问。这就是问题所在。
function func_name () {
 ssh jumphostname; 
 sc $hostname # from jump host secure console to another host given as input from terminal
}

这个函数只能使你登录到跳板机,但无法从那里安全地登录到另一台主机上的 secureconsole。

-bash-4.1$func_name host.me.com 可以通过跳板机让我连接到 host.me.com 的控制台

有没有相应的函数可以实现这个功能呢? 还是我需要编写一个脚本?


3
请具体说明您的问题,我建议您重新措辞问题以更恰当地表达,因为这不仅仅是关于如何编写bash函数,更多的是关于如何从本地站点进行ssh远程控制。 - hmedia1
当我试图理解你想做什么时,我会想为什么你不能只是使用 ssh user@host 并从那里工作呢?就像我说的,如果你更具体一些,或许提供一个使用案例场景,那么人们可能会能够帮助你。对于多功能远程控制和异常处理,我经常使用 expect 包装器。 - hmedia1
是的。我将问题更具体化了。 - stackuser
在我的另一个答案这里中,我解释了一个易于跟随的过程。 - Mussa Charles
5个回答

1

这是我做的方法。

  1. 在主目录下创建一个函数文件夹
  2. 将我的函数编写为shell脚本
  3. 在我的bash_profile中将该文件作为别名引用
  4. 重置源

示例

mkdir ~/.functions
echo '#!/bin/bash
      echo $1' > ~/.functions/ekho
echo 'alias ekho="sh ~/.functions/ekho"' >> ~/.bash_profile
source ~/.bash_profile

现在,您可以从任何位置永久调用您的方法。
ekho "Wow"

我一直在寻找这样的东西,它帮助我创建了一个也可以接受参数的别名。唯一的区别是我将别名添加到了 ~/.bashrc 而不是 ~/.bash_profile,这正是我所需要的。 - Lucas Camino

0

在测试[ ]中,除非您使用$( )模拟变量,否则不应使用命令。仍然不确定SSH是否会返回测试结果。 SSH需要您连接的TTY,而不是您当前所在的TTY。这将导致问题!

以下是一个没有使用SSH的示例...

suleiman@antec:~$ if [ "$(cat ~/test.txt)" ]; then echo "Hello World"; else echo "failed"; fi
Hello World
suleiman@antec:~$ if [ "$(cat /this/file/dont/exsist 2>/dev/null)" ]; then echo "Hello World"; else echo "failed"; fi
failed

附加:

-bash:sc:未找到命令

这意味着您在主机上没有安装 spreadsheet

此功能仅用于登录跳转主机,而不是从那里进入安全控制台。

你想做什么?

你知道 SSH 是什么吗? 它打开远程 TTYs,或者换句话说:它打开一个远程安全控制台

你不能运行一个脚本并在其中放置一个 ssh 登录,然后认为所有代码都将在新控制台中运行,也不会发生这种情况。

您可以在控制台上运行 ssh,以便获得自己的 TTY 并输入一些命令。或者您可以将 ssh 与一些命令结合使用在脚本中,例如

ssh user@host echo "Hello World!"

你也可以通过 ssh 传递一些变量或文本。
echo "Hello World!" | ssh user@host cat

对此你无法做更多,也不应该这样做!


我们在bash_profile中创建别名,它可以正常运行。但是,在登录后,我想从那个跳板主机上运行sc命令到目标主机。 - stackuser
ssh user@host sc是你在寻找的吗?我更新了我的帖子。 - Mario

0

以下链接将帮助您继续前进

ssh username@host_address "command to execute"

例如输出:
arul@OA2:~/work/images$ ssh arul@localhost echo "hai"
arul@localhost's password: 
hai
arul@OA2:~/work/images$

使用ssh arul@localhost命令将登录并在当前已登录提示符中打印“echo hai”命令。

引用:https://www.cyberciti.biz/faq/unix-linux-execute-command-using-ssh/


欢迎来到StackOverflow。请注意,仅提供链接的答案通常可以通过自己解释您打算回答的内容(包括来自链接的任何直接相关信息),并仅提供进一步信息的链接来改进。例如,请参见https://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers - kojiro
感谢@kojiro提供的宝贵意见。 - Arulpandiyan Vadivel

0

我会写这个

con.sole() {
    if ! ssh -T jumphostname true; then
        printf 'Jump host "%s" not available.\n' jumphostname >&2
        return 1
    fi
    sc "$@"
}

方括号不是if语句语法的一部分。它是一个独立的命令,与test相同。


以上脚本只能让我跳转到跳板机,无法在此之后执行sc命令。 con.sole hostname.com 警告:已将“jumphost.com(RSA)”永久添加到已知主机列表中。 -bash:sc:找不到命令 - stackuser

-2

这是因为您在if和[之间没有留下空格。您想要的正确语法是...

function con.sole
{
    if [ ssh jumphostname ]; then
        sc $1;
    else 
        echo "host not available"
    fi 
}

来自墨西哥的问候!


离开空格后,它出现了“-bash: [: ssh: unary operator expected”的错误提示,所以我添加了单引号。现在它可以工作了,但真正的问题仍然存在。 - stackuser
你想做什么?你想连接一个服务器,然后再连接到另一个服务器吗?本地->服务器1->服务器2? - Mr Octavious
我认为你需要学习一下在shell中[的含义;它不是一个分组运算符。 - chepner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接