如何使用sshpass?


28

我需要使用sshpassSSH从Java代码通过SSH启动远程命令。

如果我手动输入控制台:

ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'

可以正常工作,但要求输入密码。所以我尝试运行sshpass

sshpass -p mypass ssh -p 22 user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -l user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh -t user@ipaddress mplayer '/media/data/myFavouriteSong.mp3'
sshpass -p mypass ssh user@ipaddress echo 'OK'

他们都不起作用。

Answers:


28

这可能是由进行的主机密钥检查引起的ssh。它看起来像sshpass上无效的主机密钥保持沉默(不输出对双方都不利stderr,也不stdout),并与状态代码存在6。在撰写本文时,这是修订版50,并且代码中的匹配常数是RETURN_HOST_KEY_UNKNOWN,这表明该错误。

您的错误代码可能有所不同,而查看上面链接的代码可能会给您一些启示。

如果您的问题是无效的主机密钥,则应考虑使用CLI选项覆盖错误,三思而后行。您的计算机可能受到威胁,或者可能受到MITM攻击!如果您100%肯定不是这种情况,并且您没有办法使经过验证的主机密钥保持最新,则可以使用以下命令:

sshpass -pfoobar ssh -o StrictHostKeyChecking=no user@host command_to_run

2
对于brew install,在-p之后需要一个空格。github.com/hudochenkov/homebrew-sshpass
AnneTheAgile 2016年

注意:每个人都应该记住,尽可能使用无密码的SSH主机密钥更加安全!根据定义,使用SSHPass不太安全。
Questionmark

@Questionmark虽然正确,但是在某些情况下,远程端点不支持通过密钥进行身份验证。sshpass派上用场了
exhuma

是的我知道。这就是为什么我说“只要有可能”的原因
Questionmark

1
有了足够新的SSH,就可以了StrictHostKeyChecking=accept-new
大师

5

sshpass仅在密码提示以结尾时有效assword:

如果您的密码提示不同,则可能必须调整的源代码sshpass才能识别您的提示。

Password for user@host:在某些系统上看到过密码提示 ,也许这是您的问题。


1
抱歉?-P prompt Which string should sshpass search for to detect a password prompt
m3nda

2
这个新选项(至少需要sshpass的V1.0.6)解决了该问题。
rjs

哦对不起。这种问题(解决方案?)经常发生,旧的问题已经在新版本中解决。谢谢。
m3nda

2

我认为您想要类似的东西:

sshpass -p yourpassword ssh user@ipaddress somecommand

例如,这对我有用:

sshpass -p mypassword ssh username@10.0.0.9 touch foo

1

您是否设置了无密码登录?

使用OpenSSH的无密码登录 http://www.debian-administration.org/articles/152


由于在企业中启用无密码登录的不便之处,我宁愿坚持使用sshpass
Roman Rdgz 2013年

您是否尝试过:sshpass -p'mypass'ssh username@server.example.com
koni_raid 2013年

我做到了,不管我使用“ mypass”还是mypass。它开始永远等待
Roman Rdgz 2013年

sshpass -V有效吗?
koni_raid

它打印:“该程序是免费软件,可以根据GPL条款进行分发。有关更多信息,请参见COPYING文件。” 然后结束执行,什么也不做(我尝试在所处理的命令开头添加-V,而不仅仅是键入sshpass -V)
Roman Rdgz 2013年

1

有很多方法可以做到,这是我建议的解决方案:

首先,将密码存储在变量中可为您提供更灵活的命令。sshpass有一个选项:

-e:此选项允许从$SSHPASS环境变量读取密码

您可以通过两种方式设置此变量:

  1. 直接在您的代码中设置:

    export SSHPASS='your_pass'
    
  2. 或要求它:

    readPassword () {
      echo Ssh Password: 
      read -s SSHPASS
      eval "export SSHPASS='""$SSHPASS""'"
    }
    
    # read password
    
    readPassword
    

比执行您的命令;

  1. 如果您的命令是静态的,请直接运行它:

    sshpass -e ssh user@host << EOF
    mplayer '/media/data/myFavouriteSong.mp3'
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF
    
  2. 如果您的命令是动态的,请使用以下命令:

    DYN_FILE_LOC='/media/data/myFavouriteSong.mp3'
    
    eval 'sshpass -e ssh user@host << EOF
    mplayer "$DYN_FILE_LOC"
    command2 parameter1 parameter2 parameter3 ...
    command3 parameter1 parameter2 parameter3 ...
    ...
    EOF'
    

希望这对某人有帮助。


在您的readPassword函数中,您不能只导出SSHPASS吗?
kutschkem 2015年

@kutschkem,我相信,但是我的想法是在这里。我不想将我的通行证写在静态文件中,但是我不想一次又一次地为许多服务器(7个以上)写密码,我只写了一次:)您不必使用readPassword功能,只需写密码即可,应该工作:)只有我想分享我的代码,这是一个sshpass用于动态命令的示例 :D
veysiertekin 2015年

不,我只是说在读取之后不需要评估,导出不需要分配。ss64.com/bash/export.html
kutschkem

-e的问题是出口将在您的历史记录中列出
ejaenv

0

sshpass使用伪终端,man页面包含偶尔中断的歉意。您也可以尝试fd0ssh。如果您不需要发送stdin到远程计算机上的进程,则可以使用它。如果您只是发出命令并捕获结果,那将起作用。


0

sshpass语法是

sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

请注意,-p和密码之间没有空格。

我还注意到,您必须至少手动与ssh连接一次才能获取要连接的计算机的RSA密钥,~/.ssh/known_hosts然后才能在sshpass允许连接之前进入文件。

因此,在获得known_hosts文件中的条目之后,我可以运行以下命令

sshpass -ffilename_with_password_in_it ssh user@server uname -a

它将uname -a在远程服务器上执行该命令,并将结果输出到本地计算机上的标准输出中。


0

您需要的是 -f -t -t -t

sshpass -p$PASS ssh -f -t -t -t $USER@$HOST $COMMAND

另外,您可能必须从远程计算机上的sudo config(/ etc / sudoers)中删除“ requiretty”。


0
  1. 钥匙

    ssh-keygen -t rsa

  2. 在远程服务器上创建一个.ssh文件夹,它将要求输入密码

    ssh $USER@SEVERNAME mkdir -p .ssh

  3. 将密钥复制到远程服务器

    cat .ssh/id_rsa.pub | ssh $USER@SERVER 'cat >> .ssh/authorized_keys'


检查是否要求输入密码,如果不要求,则可以使用。

ssh $USER@SEVERNAME 'command'

0

@exhuma的例子可以使它为我工作。

密码必须为-pPassword(无空格)形式

也可能需要引号: sshpass -p'Password&0' user@hostname

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.