如何将sshpass命令放入bash脚本中?

10

我想在bash脚本中运行sshpass命令,但它没有起作用。如果我在终端中运行同样的命令,它可以正常工作,但在bash脚本中运行时却不起作用。

#! /bin/bash

sshpass -p 'password' ssh user@host command

我意识到安全问题,但现在不重要。

有人可以帮忙吗?我有遗漏什么吗。

谢谢


“不工作”是什么意思?你能更好地解释一下吗?在sshpass调用之后,你可以执行echo $?吗? - Grzegorz
1
你是从cron作业运行脚本吗?也许sshpass不在$PATH中,因为cron作业没有运行你的.profile - Barmar
5个回答

19

尝试使用ssh的"-o StrictHostKeyChecking=no"选项("-o"是告诉ssh你将要使用一个选项的标志)。这将接受来自你的ssh连接的任何传入RSA密钥,即使该密钥不在“已知主机”列表中。

sshpass -p 'password' ssh -o StrictHostKeyChecking=no user@host 'command'

非常感谢,你已经为我解决了这个问题。 - Alex Hurtado

16
在命令行中运行which sshpass,以获取sshpass的绝对路径,并在bash脚本中进行替换。
你也应该对要运行的command执行同样的操作。
问题可能是找不到它。

好的,现在它不起作用了。让我在这里放我想要传递的命令。我甚至尝试将所有路径都放进去:/usr/bin/sshpass -p 'password' /usr/bin/ssh pi@192.168.2.103 sudo /bin/sh /home/Projecto/AVstart_1.sh - rcsimoes
@rcsimoes 你遇到了什么错误?在终端中运行确切的命令并发布你所得到的错误。 - Emil Davtyan
在终端中,该命令可以正常工作,但在bash脚本或使用os.system的Python中却无法正常工作。我已经通过将“StrictHostKeyChecking=no”添加到命令中解决了这个问题。感谢大家的帮助。现在我有另一个问题,但我想我应该提出一个新问题,因为它与此无关。 - rcsimoes

8

1 - 您可以像这样编写脚本来使用 sshpass的ssh 命令:

#!/bin/bash

export SSHPASS=password
sshpass -e ssh -oBatchMode=no user@host

2-您可以像这样编写sshpasssftp命令脚本:

#!/bin/bash

export SSHPASS=password

sshpass -e sftp -oBatchMode=no -b - user@host << !
   put someFile
   get anotherFile
   bye
!

sftp 和它有什么关系? - Barmar
@Barmar:请查看这两个示例。一个显示ssh命令,另一个显示sftp。 - anubhava
那么你所做的唯一重要的更改就是从命令行选项获取密码,而不是从环境变量中获取。为什么这会解决问题呢? - Barmar
@Barmar:我不会在没有测试/验证的情况下发布答案。我测试了两个命令,并发现它们都可以正常工作。我的命令与“环境变量”之外还有其他差异。 - anubhava
你的另一个更改是 BatchMode=no,这是默认设置。但是,如果他的问题与该设置有关,那么当他交互式运行命令时,它也不会起作用。 - Barmar

5

我不理解被接受的答案如何回答实际问题:如何在bash脚本文件中给出sshpass后在服务器上运行任何命令。因此,我提供一个答案。


在提供的脚本命令之后,执行以下额外命令:

sshpass -p 'password' ssh user@host "ls; whois google.com;" #or whichever commands you would like to use, for multiple commands provide a semicolon ; after the command

在你的脚本里:

#! /bin/bash

sshpass -p 'password' ssh user@host "ls; whois google.com;"

1
这对我有用:

这对我有用:

#!/bin/bash

#Variables
FILELOCAL=/var/www/folder/$(date +'%Y%m%d_%H-%M-%S').csv    
SFTPHOSTNAME="myHost.com"
SFTPUSERNAME="myUser"
SFTPPASSWORD="myPass"
FOLDER="myFolderIfNeeded"
FILEREMOTE="fileNameRemote"

#SFTP CONNECTION
sshpass -p $SFTPPASSWORD sftp $SFTPUSERNAME@$SFTPHOSTNAME << !
    cd $FOLDER
    get $FILEREMOTE $FILELOCAL
    ls
   bye
!

可能需要安装sshpass:

sudo apt-get install sshpass

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