我正在尝试编写一个脚本来通过 SFTP 备份文件。问题是,它需要密码,我看不到手动指定 SFTP 密码的方法。我听说过使用公钥不需要密码,但这需要能够通过 ssh 进入远程服务器并修改一些配置文件,而我做不到。
目前我的解决方案是使用cURL,但这是不安全的(使用普通 FTP)。我还查看了该.netrc
文件,但这似乎是针对 FTP 而不是 SFTP。如何手动指定 sftp 的密码?
我正在尝试编写一个脚本来通过 SFTP 备份文件。问题是,它需要密码,我看不到手动指定 SFTP 密码的方法。我听说过使用公钥不需要密码,但这需要能够通过 ssh 进入远程服务器并修改一些配置文件,而我做不到。
目前我的解决方案是使用cURL,但这是不安全的(使用普通 FTP)。我还查看了该.netrc
文件,但这似乎是针对 FTP 而不是 SFTP。如何手动指定 sftp 的密码?
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
cURL 可以支持 sftp,如手册所述:
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.
您可能还想考虑使用 python(paramiko 模块),因为它可以从 shell 快速调用。
pip install paramiko
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 )
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' 出现并发送命令。然后结束。
要让它工作:
然后运行它:
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 "
为了使用公钥,您不需要修改任何“配置文件”。您只需将您的公钥副本留在 ssh 知道可以查看的位置(通常~/.ssh/authorized_keys
)。你可以用 sftp 做到这一点。如果您还没有在服务器上建立任何 authorized_keys 文件,您可以简单地将 id_rsa.pub 文件放在它的位置。
您不能从命令行指定 ssh / scp 或 sftp 的密码。在不提示输入密码的情况下进行连接的唯一方法是使用公钥身份验证。
你说你不能 ssh 到服务器来修改配置文件,但是如果你可以 sftp 到服务器,你可能可以上传你的公钥。
您的公钥只需放在主目录中的 .ssh 目录下即可。