在Bash脚本中为sftp指定密码

时间:2011-03-11 04:11:29

标签: bash sftp remote-backup .netrc

我正在尝试编写一个脚本来通过SFTP备份文件。问题是,它需要密码,我看不到手动为SFTP指定密码。我听说过使用公钥不需要密码,但这需要能够ssh到远程服务器并修改一些配置文件,这是我无法做到的。

目前我的解决方案是使用cURL,但这是不安全的(使用普通FTP)。我还查看了.netrc文件,但这似乎是针对FTP而不是SFTP。如何为sftp手动指定密码?

6 个答案:

答案 0 :(得分:7)

Lftp允许为ftp和sftp指定密码,并且根本不需要公钥。您的sh同步脚本可能如下所示:

#!/bin/sh
# Define folders
THEFOLDER='/mnt/my/folder'
# List files
THEFILES=`ls -p $THEFOLDER | grep -v "/"`

for file in $THEFILES
do
  echo "Processing $file"
  lftp -u login,password -e "put $THEFOLDER/$file;quit"  theftp/sub/folder
done

答案 1 :(得分:4)

您可能还想考虑使用python(paramiko模块),因为它可以从shell中快速调用。

安装模块

pip install paramiko

示例FTP上载脚本

import paramiko

username = 'my_username'
password = 'my_password'

transport = paramiko.Transport((server, 22))
transport.connect(username=username, password=password)
sftp = paramiko.SFTPClient.from_transport(transport)    

local_filename = '/tmp/filename'
remote_filename = 'MyFiles/temp.txt'

sftp.put( local_filename, remote_filename )

答案 2 :(得分:2)

您无法从命令行为ssh / scp或sftp指定密码。在不提示输入密码的情况下连接的唯一方法是使用公钥认证。

你说你不能ssh到服务器来修改配置文件,但如果你可以sftp到服务器,你可以上传你的公钥。

您的公钥只需要放在主目录的.ssh目录下。

答案 3 :(得分:2)

cURL可以支持sftp,如the manual所述:

USING PASSWORDS

 FTP

   To ftp files using name+passwd, include them in the URL like:

        curl ftp://name:passwd@machine.domain:port/full/path/to/file

   or specify them with the -u flag like

        curl -u name:passwd ftp://machine.domain:port/full/path/to/file

 FTPS

   It is just like for FTP, but you may also want to specify and use
   SSL-specific options for certificates etc.

   Note that using FTPS:// as prefix is the "implicit" way as described in the
   standards while the recommended "explicit" way is done by using FTP:// and
   the --ftp-ssl option.

 SFTP / SCP

   This is similar to FTP, but you can specify a private key to use instead of
   a password. Note that the private key may itself be protected by a password
   that is unrelated to the login password of the remote system.  If you
   provide a private key file you must also provide a public key file.

答案 4 :(得分:2)

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

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

将其放在名为sftp_autologin.sh的文件中。 \r发送一个sftp来执行命令。我没有包含“' p'在密码中,因为在某些系统上它是大写的,其他是小写的。期望产生sftp命令。等待字符串' assword'被看到并发送命令。然后结束。

要使其发挥作用:

  1. 安装期望,我使用5.44.1.15
  2. 确保您可以在交互模式下进入您的盒子并提供密码。
  3. 确保此bash脚本具有可执行权限。
  4. 然后运行它:

    chmod +x sftp_autologin.sh
    ./sftp_autologin.sh
    

    它会让你进入sftp命令行,而不会提示你输入密码。

    不安全吗?

    关于你可以运行的最不安全的命令。它将密码暴露给命令行历史记录,以及任何可以阅读“ps”的人。输出,基本上一起击败了密码的全部目的。

    但是嘿,这是另一个欺诈火灾的记录,每年只有大约250亿美元的受害者损失。让我们去500b。

    这会自动运行一些带有sftp shell的命令,并在完成后自动退出:

    #!/bin/bash
    expect -c "
    spawn sftp myuser@myserver.com
    expect \"assword\"
    send \"yourpassword\r\"
    expect \"sftp\"
    send \"get your_directory/yourfilename.txt\r\"
    expect \"sftp\"
    send \"exit\r\"
    interact "
    

答案 5 :(得分:1)

要使用公钥,您无需修改​​任何“配置文件”。您只需要将公钥的副本留在ssh知道查看的位置(通常为~/.ssh/authorized_keys)。你可以用sftp做到这一点。如果您尚未在服务器上建立任何authorized_keys文件,则只需将id_rsa.pub文件放在其位置即可。