AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 841831
Accepted
klor
klor
Asked: 2017-04-01 08:00:21 +0800 CST2017-04-01 08:00:21 +0800 CST 2017-04-01 08:00:21 +0800 CST

SSH 询问一次密码,重复使用密码直到超时结束

  • 772

我怎么解决这个问题?我有一个 bash 脚本(在 Ubuntu 服务器下),做几个 SSH 连接,执行一些远程传输,比如 rsync 多次。

我的问题是,我想避免多次输入密码。但我不想使用 SSH 公钥交换,因为如果有人拥有密钥,就可以连接远程计算机。

我想要以下内容:

  • SSH 应该在我启动 bash 脚本时询问密码
  • 重复使用密码,所以在超时之前不要再次询问密码
  • 超时后,再次询问密码。

类似的东西,sudo 是如何工作的,只是使用 ssh。

知道如何解决这个问题吗?

编辑1:

我发现了一个名为 ssh 多路复用的新 SSH 功能。也许使用它我可以达到我想要的目标。

https://unix.stackexchange.com/questions/50508/reusing-ssh-session-for-repeated-rsync-commands

这行得通吗?

ssh
  • 5 5 个回答
  • 14370 Views

5 个回答

  • Voted
  1. James Sneeringer
    2017-04-01T10:49:58+08:002017-04-01T10:49:58+08:00

    (根据klor的请求重新发布我的评论作为答案)。

    这不是您想听到的,但这就是基于密钥的身份验证的用途。只要您在私钥上加上密码,它就不会比密码验证安全。

    您可以使用ssh-agent来避免每次都需要输入密码,并且该-t选项ssh-agent将为您提供您所追求的超时行为。

    # start a shell under ssh-agent with a 5-minute timeout for keys loaded with ssh-add
    ssh-agent -t 300 /bin/bash
    
    # add your key(s) to the agent; ssh-add will prompt for passphrase, if one is set
    ssh-add
    
    # do some stuff
    ssh remote.server cat /some/file
    rsync file1 file2 [email protected]:/some/directory
    
    # after 300 seconds, timeout reached, run ssh-add again to re-add your keys
    ssh-add
    

    您的脚本将需要一些逻辑来确定何时发生超时。一种方法是运行sshand rsyncwith -o BatchMode=yes,这将阻止交互式身份验证方法,因此如果密钥不再可用,ssh将退出而不是提示输入密码。您可以使用退出代码来确定是否需要ssh-add再次运行;在这种情况下$?应设置为。255

    您仍然需要弄清楚如何将密码提供给ssh-add,因为它没有提供以编程方式接受它的方法。除非您的脚本会提示您手动输入,否则您可能需要使用expect该部分,这意味着在某处对密码进行硬编码。

    • 6
  2. Best Answer
    klor
    2017-04-06T09:30:07+08:002017-04-06T09:30:07+08:00

    看来我找到了满足我需求的完美解决方案:

    为重复的 rsync 命令重用 ssh 会话

    #!/bin/bash
    
    # Create ssh-mux (SSH multiplex) dir only if not exists
    [[ ! -d dir ]] || mkdir ~/.ssh/ssh-mux
    
    apache_site_path_source="/var/www/source_site"
    apache_site_path_target="/var/www/target_site"
    
    # Solution: Start SSH multiplexing session (works fine)
    # https://unix.stackexchange.com/questions/50508/reusing-ssh-session-for-repeated-rsync-commands
    sudo ssh -nNf -o ControlMaster=yes -o ControlPath="~/.ssh/ssh-mux/%L-%r@%h:%p" [email protected]
    
    sudo rsync -av --progress -e 'ssh -l root -p 22 -o "ControlPath=~/.ssh/ssh-mux/%L-%r@%h:%p"' 192.168.0.1:${apache_site_path_source}/. ${apache_site_path_target}/;
    printf "\n\n\n\n\n\n"
    sudo rsync -av --progress -e 'ssh -l root -p 22 -o "ControlPath=~/.ssh/ssh-mux/%L-%r@%h:%p"' 192.168.0.1:${apache_site_path_source}/. ${apache_site_path_target}/;
    printf "\n\n\n\n\n\n"
    sudo rsync -av --progress -e 'ssh -l root -p 22 -o "ControlPath=~/.ssh/ssh-mux/%L-%r@%h:%p"' 192.168.0.1:${apache_site_path_source}/. ${apache_site_path_target}/;
    printf "\n\n\n\n\n\n"
    
    # Finish SSH multiplexing session
    sudo ssh -O exit -o ControlPath="~/.ssh/ssh-mux/%L-%r@%h:%p" [email protected]
    

    此解决方案仅询问一次密码,然后执行 rsync 3 次,而无需再次询问密码。每个 rsync 都使用 SSH 多路复用重用 SSH 连接。

    可以更改 SSH 配置,并存储 SSH 多路复用设置,但使用此解决方案无需更改服务器配置,脚本按原样工作。

    • 2
  3. Evidlo
    2020-11-20T23:45:26+08:002020-11-20T23:45:26+08:00

    如果您使用的是密钥文件,则可以使用该AddKeyToAgent选项 (OpenSSH>=7.2)。

    ssh(1):添加一个 AddKeysToAgent 客户端选项,可以设置为“yes”、“no”、“ask”或“confirm”,默认为“no”。启用后,如果 ssh-agent 正在运行,则在身份验证期间使用的私钥将添加到它(如果设置为“确认”,则启用确认)。

    所以你的脚本可能看起来像这样。

    # make sure the ssh agent is running (may not be necessary on some systems)
    eval "$(ssh-agent -s)"
    
    # ssh commands.  only the first command needs AddKeysToAgent option
    ssh -o AddKeysToAgent=yes user@host "echo hello"
    ssh user@host "echo world"
    ...
    
    • 1
  4. Andrew Domaszek
    2017-04-01T10:49:05+08:002017-04-01T10:49:05+08:00

    将James Sneeringer的评论实现为配置文件脚本。

    # This script must be sourced to be useful. For example, if you name this script 
    # ~/.bash_autossh, at the end of .bashrc, source $HOME/.bash_autossh
    # Tested in bash & zsh
    # MIT license, if you need a license.
    
    # An absolute path to a private key:
    AUTOLOADSSHID=$HOME/.ssh/id_ecdsa
    # Timeout is in seconds, optional:
    SSHID_TIMEOUT=60
    
    auto_init_ssh_agent() {
      if [ "${SSH_AGENT_PID}x" = "x" ] || \
         [ "${SSH_AUTH_SOCK}x" = "x" ] || \
         ps -p "${SSH_AGENT_PID}" >& /dev/null || \
         [ ! -e "${SSH_AUTH_SOCK}" ]; then
        # There are problems with the agent, initialize a new agent.
        # Agents started this way should be manually stopped with ssh-agent -k
        source <(ssh-agent -s)
      fi
      if ! ssh-add -l | grep "${AUTOLOADSSHID}" >/dev/null; then
        # The autoload key is not present, try to load it.
        SSH_ADDTL_ARGS=()
        if [ "${SSHID_TIMEOUT}x" != "x" ]; then
          SSH_ADDTL_ARGS+=( -t "${SSHID_TIMEOUT}" )
        fi
        # This may ask for a password, as appropriate
        ssh-add "${SSH_ADDTL_ARGS[@]}" "${AUTOLOADSSHID}"
        unset SSH_ADDTL_ARGS
      fi
    }
    
    _autossh() {
      args=( "$@" )
      auto_init_ssh_agent
      ssh "${args[@]}"
    }
    
    alias autossh=_autossh
    

    然后您可以运行该命令autossh myserver,如果代理不可用,它将自动初始化代理。别名是为了防止意外调用脚本中的交互函数。

    有问题的是,在不使用 WM 会话自动启动代理的系统上,这可能会使您的机器充满 ssh-agent 进程,您可能需要ssh-agent -k结束它,或者killall ssh-agent. 如果您想在整个登录会话或多个进程会话中共享单个 ssh-agent,则可能需要一些额外的脚本。

    • 0
  5. Diego Velez
    2017-04-01T10:20:05+08:002017-04-01T10:20:05+08:00

    我通常会告诉你尝试expect,但在这种情况下,我认为使用sshpass 更好,它非常易于安装和使用,我在这里发布一些用例

    sshpass -p<pass> ssh <args> sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

    玩得开心 :)

    编辑 1

    在脚本上

    #!/bin/bash
    read -p "give me the password" pass
    sshpass -p"$pass" ssh -o StrictHostKeyChecking=no user@host command_to_run
    
    • -1

相关问题

  • 如何最好地设置 ssh 隧道以访问远程网络 (Linux)

  • SSH 和重定向

  • 通过 SSH 会话使用 NET USER 命令拒绝访问

  • SSH 服务器零日漏洞利用 - 保护自己的建议

  • ubuntu apt-get upgrade - 如何在 shell 中单击确定?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve