我需要从Linux主机使用sftp传输日志文件到远程主机。我的行动组也向我提供了同样的证书。但是,由于我没有对其他主机的控制权,我不能生成并与其他主机共享RSA密钥。

那么,是否有一种方法可以从Bash脚本内部通过cron作业运行sftp命令(提供用户名/密码)?

我发现一个类似的堆栈溢出问题,指定密码sftp在Bash脚本,但没有满意的答案,我的问题。


当前回答

Bash程序等待sftp请求密码,然后发送它:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

你可能需要安装expect,将“Password”改为小写“p”以匹配提示符接收到的内容。这里的问题是,它在文件和命令历史中以纯文本形式暴露了您的密码。这几乎违背了设置密码的初衷。

其他回答

EXPECT是一个非常好用的程序。

在Ubuntu上安装:

sudo apt-get install expect

在CentOS机器上安装:

yum install expect

假设您想要连接到sftp服务器,然后将本地文件从本地机器上传到远程sftp服务器

#!/usr/bin/expect

spawn sftp username@hostname.com
expect "password:"
send "yourpasswordhere\n"
expect "sftp>"
send "cd logdirectory\n"
expect "sftp>"
send "put /var/log/file.log\n"
expect "sftp>"
send "exit\n"
interact

这将使用您的密码打开到服务器的sftp连接。

然后它会转到你要上传文件的目录,在这里是“logdirectory”

这将从本地目录/var/log/中上传一个文件名为file.log的日志文件到远程服务器上的“logdirectory”

Bash程序等待sftp请求密码,然后发送它:

#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "

你可能需要安装expect,将“Password”改为小写“p”以匹配提示符接收到的内容。这里的问题是,它在文件和命令历史中以纯文本形式暴露了您的密码。这几乎违背了设置密码的初衷。

我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是Tectia SSH包,它有一个选项——password,可以在命令行上传递密码。

example: sftp——密码=“用户密码”

批处理示例:

(
  echo "
  ascii
  cd pub
  lcd dir_name
  put filename
  close
  quit
    "
) | sftp --password="password" "userid"@"servername"

我想我应该分享这个信息,因为我正在看各种网站,在运行帮助命令(sftp -h)之前,我很惊讶地看到密码选项。

一些人提到了sshpass,但没有太多清晰的编码示例……

这是我们使用bash脚本进行rsync备份的方式:

sshpass -p "${RSYNC_PASSWORD}" sftp "${RSYNC_USER}"@"${RSYNC_REMOTE_HOST}"

请记住,在正常工作之前,您必须sudo apt安装sshpass。

您可以使用带有scp和os库的Python脚本进行系统调用。

Ssh-keygen -t rsa -b 2048(本机) ssh-copy-id user@remote_server_address 创建一个像这样的Python脚本:

    import os
    cmd = 'scp user@remote_server_address:remote_file_path local_file_path'
    os.system(cmd)

在crontab中创建一个规则来自动化您的脚本 完成