这是我的问题:我想在 ssh 到远程服务器后执行 scp 命令,而无需输入任何密码。我描述一下我的步骤。我的第一步是:
ssh-keygen -t rsa
和
local@host$ ssh-copy-id -i /root/.ssh/id_rsa.pub remote@host
在本地机器上
然后我在远程机器上做了同样的事情:
ssh-keygen -t rsa
和
remote@host$ ssh-copy-id -i /root/.ssh/id_rsa.pub local@host
经过上述描述,我可以在两台机器上执行 ssh,而无需输入任何密码。我可以在远程机器上执行 scp 命令scp /home/remote/info.txt.gz local@host:/root/
,一切都运行良好。
然后我尝试制作一个包含下面描述的一些操作的脚本,脚本中的最后一步是
scp
命令,但它没有按我的预期工作。
#!/bin/bash
remote_user=$1
remote_host=$2
local_user=$3
local_host=$4
echo "Testing connection to ${host}..."
ssh -n -o NumberOfPasswordPrompts=0 ${remote_user}@${remote_host}
if [ $? -ne 0 ]; then
echo "FATAL: You don't have passwordless ssh working."
echo "Try running ssh-keygen"
exit 1
fi
echo "Okey. Starting the process."
ssh ${remote_user}@${remote_host} netstat -tulpn > /home/${remote_user}/info.txt;uptime |awk '{ print $3 }' >> /home/${remote_user}/info.txt;
if [ $? -ne 0 ]; then
echo "An error occurred."
else
echo "File is ready for gzipping!"
fi
gzip /home/${remote_user}/info.txt
if [ $? -ne 0 ]; then
echo "file was not archived"
else
echo "Archive is ready!"
fi
echo "Starting copy archive from ${remote_host} to ${local_host}"
scp /home/${remote_user}/info.txt.gz ${local_user}@${local_host}:/root/
if [ $? -ne 0 ]; then
echo "Error while transferring!"
else
echo "Copy has been transferred successfully!"
fi
scp 命令要求我输入密码 o_O。
当我手动完成脚本中的所有步骤时,一切都运行良好,但在脚本中
scp
需要密码。我读了很多堆栈交换并找到了这个答案使用已建立的 SSH 通道。这个答案需要打开 SSH,但我的问题可以通过 SSH 手动解决,正如我所说,但在脚本中它不起作用。我该怎么做才能制作scp
没有密码的作品?
答案1
如果正在运行以下 scp 命令local_host
,那么您正在尝试 scp as local_user
-local_host
当然local_user
这会提示输入密码,因为您仅对远程 <-> 本地用户进行无密码登录 - 而不是本地 <-> 本地
scp /home/${remote_user}/info.txt.gz ${local_user}@${local_host}:/root/
答案2
如果您已经设置了 ssh 密钥,请研究使用 sftp 传输文件。单个命令,您不需要按照当前尝试的方式进行操作,即 ssh 然后 scp,普通 sftp 就可以了。