【问题标题】:ssh script to connect to server [duplicate]ssh脚本连接到服务器[重复]
【发布时间】:2025-11-23 04:35:01
【问题描述】:

我有这个基本脚本file.sh 连接到服务器

name=username
routerip=172.21.200.37

echo "$name""@""$routerip"
ssh "$name""@""$routerip"

样本输出:

$ ./file.sh
username@172.21.200.37
username@172.21.200.37's password:

我想知道如何最好地处理我的脚本中请求的密码。我应该使用expect 吗?或者有没有别的办法。此外,如果密码在脚本中,是否应该对其进行加密以确保安全?

也许是一个愚蠢的问题,但是有没有办法通过用户名连接到服务器?

【问题讨论】:

标签: bash ssh expect


【解决方案1】:

如果您关心安全性,您肯定不想在脚本中嵌入密码。而且你也不能真正“加密”密码,因为脚本必须知道如何解密它,任何阅读脚本的人都会看到你是如何做到的(以及解密密钥是什么等)。

如果您在机器 A 上运行了一个脚本,该脚本被授权登录到机器 B,我一直这样做的方法是在机器 A 上设置一个私有 ssh 密钥,并将公钥放在用户的authorized_keys 机器 B 上的文件。

(在回答您的最后一个问题时,不,没有用户名就无法进行这种登录。)

【讨论】:

    【解决方案2】:

    我同意@Steve Summit 的观点,如果机器 B 拥有机器 A 的公钥,那么只需提供用户名即可登录。您无需提供密码。

    使用下面的简单脚本来解决您的问题

    USERNAME=myUsername
    GRID=$1
    SERVER=$2
    
    echo "=================== Connecting ==================="
    if [ ${GRID} == 'dev' ] && [ ${SERVER} == 'uk' ]
    then
            ssh -l ${USERNAME} "dev-uk.xyz.com"
    
    elif [ ${GRID} == 'dev' ] && [ ${SERVER} == 'us' ]
    then
            ssh -l ${USERNAME} "dev-us.xyz.com"
    
    else
    ssh -l ${USERNAME} ${GRID}"-"${SERVER}".xyz.com"
    fi
    

    所以,在连接时你只需要运行

    ./file.sh dev uk
    

    ./file.sh qa jer
    

    【讨论】:

    • 请注意How to Answer 部分的“回答正确提出的问题”,以及其中关于“...之前已被多次询问和回答”的问题的要点。
    • 另外,您的脚本有很多错误——尝试通过shellcheck.net 运行它。 ${foo}$foo 一样容易发生字符串拆分和全局扩展;您需要将其设为"$foo" 以抑制这些行为。而且您根本不需要引用不包含任何空格或其他与 shell 语法相关的敏感字符的文字,但您 确实 需要引用扩展。并且== 不能保证在[ ] 中工作,这是一个 ksh/bash 扩展;为了与所有 POSIX 兼容的 shell 兼容,请改用 =
    • 全大写变量名称用于对 shell 本身和 POSIX 指定的实用程序有意义的名称,而小写名称保证不会冲突 - 请参阅 pubs.opengroup.org/onlinepubs/9699919799.2018edition/basedefs/…,请记住,设置shell 变量将覆盖任何类似命名的环境变量: 包含小写字母的环境变量名称的命名空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。