【问题标题】:Provide password using Shell script使用 Shell 脚本提供密码
【发布时间】:2008-10-22 06:58:53
【问题描述】:

我已经设置了我的客户端和服务器以进行无密码登录。 就像通过将服务器的 RSA 密钥复制到所有客户端的 /root/.ssh/id-rsa.pub 来进行无密码登录一样。但是这个,我是手动完成的。我喜欢使用 shell 脚本自动化这个过程,并通过脚本向机器提供密码。 如果这个问题得到解决,那么我还想使用 rsync 自动将项目推送到所有服务器。 任何机构都可以在这方面帮助我。

谢谢

【问题讨论】:

    标签: linux unix networking shell


    【解决方案1】:

    这个脚本来自 Debian(和衍生品)机器,用于分发密钥。它被称为 ssh-copy-id。你可以这样使用它:

    ssh-copy-id [-i identity_file] [user@]machine
    

    然后你输入密码,复制就完成了。您只需要这样做一次,然后就可以像往常一样通过 ssh 使用 rsync。

    #!/bin/sh
    
    # Shell script to install your identity.pub on a remote machine
    # Takes the remote machine name as an argument.
    # Obviously, the remote machine must accept password authentication,
    # or one of the other keys in your ssh-agent, for this to work.
    
    ID_FILE="${HOME}/.ssh/identity.pub"
    
    if [ "-i" = "$1" ]; then
      shift
      # check if we have 2 parameters left, if so the first is the new ID file
      if [ -n "$2" ]; then
        if expr "$1" : ".*\.pub" ; then
          ID_FILE="$1"
        else
          ID_FILE="$1.pub"
        fi
        shift         # and this should leave $1 as the target name
      fi
    else
      if [ x$SSH_AUTH_SOCK != x ] ; then
        GET_ID="$GET_ID ssh-add -L"
      fi
    fi
    
    if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then
      GET_ID="cat ${ID_FILE}"
    fi
    
    if [ -z "`eval $GET_ID`" ]; then
      echo "$0: ERROR: No identities found" >&2
      exit 1
    fi
    
    if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
      echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
      exit 1
    fi
    
    { eval "$GET_ID" ; } | ssh $1 "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1
    
    cat <<EOF
    Now try logging into the machine, with "ssh '$1'", and check in:
    
      .ssh/authorized_keys
    
    to make sure we haven't added extra keys that you weren't expecting.
    
    EOF
    

    【讨论】:

      【解决方案2】:

      如果您需要将更新/更改推送到网络中的多台计算机,那么您可能需要考虑查看像 Puppet 这样在正常渠道之外工作的东西。

      【讨论】:

        【解决方案3】:

        .ssh/authorized_keys 方法不可用时,您可以使用expect 登录远程机器。例如:

        #!/usr/bin/expect
        
        spawn   ssh user@remote-host
        expect  "*password: $"
        send    "YOUR PASSWORD HERE\n"
        send    "bash\n"
        interact
        

        【讨论】:

        • 但是expect怎么用??我试过但没有工作。这是消息。我正进入(状态。 bash: ./test2: usr/bin/expect: 错误的解释器: 没有这样的文件或目录
        相关资源