今日收获:又精进了下bash脚本编写,能够处理循环、条件判断、批量操作✌
问题:想在本地和服务器间传输多个文件,用了bash实现scp顺序传输,但每次都要输入密码。能一次性输入后,自动执行吗?
答案:来自chatgpt
希望在使用
scp
或
ssh
命令时不必每次都输入密码,可以通过设置 SSH 密钥认证来实现无密码登录。这种方法还能提高安全性。
步骤一:生成 SSH 密钥对
在本地机器上生成 SSH 密钥对:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
按提示操作:
- 系统会询问你存储密钥的位置,一般默认存储在
~/.ssh/id_rsa
。 - 系统会询问你是否设置密钥的密码短语,直接按 Enter 表示不设置。
步骤二:将公钥复制到远程服务器
将公钥复制到远程服务器的 authorized_keys
文件中:
ssh-copy-id username@remote_host
这个命令会自动将本地的公钥添加到远程服务器的 ~/.ssh/authorized_keys
文件中。
步骤三:验证无密码登录
验证你是否能够无密码登录远程服务器:
ssh username@remote_host
如果登录成功且未要求输入密码,说明配置正确。
我的Bash 脚本
src_prefix="/home/my/datasets/"
dst_prefix="/data0/username/datasets/"
for dir in {0001..0100}; do
for subdir in "$src_prefix/$dir"/*/; do
dirname=$(basename "$subdir")
src_dir="$src_prefix/$dir/$dirname/images"
dst_dir="$dst_prefix/$dir/$dirname/images"
echo "Source directory: $src_dir"
if [ -d "$src_dir" ]; then
ssh username@remote_host "mkdir -p \"${dst_dir}\""
scp "$src_dir/"*.png username@remote_host:"$dst_dir/"
fi
sleep 2
done
done
运行这个脚本时,所有的 ssh
和 scp
操作将自动执行,不会提示输入密码。