如何在同一脚本中保留 Rsync 的密码?
How to retain password for Rsync across the same script?
我写了这个脚本:
#!/bin/bash
SSH_USER=${SSH_USER:=$USER}
for department in A B C E L M V
do
mkdir -p ./resources/${div}
rsync -Pruzh --copy-links \
${SSH_USER}@server:${department}/foo/files \
${SSH_USER}@server:${department}/foo/photos \
./resources/${department}/foo
rsync -Pruzh \
${SSH_USER}@server:${department}/bar/documents \
./resources/${department}/bar
done
除了我必须写 14 次密码外,它工作得很好,这不太实用。
我听说过 ssh_agent
,但由于某些原因它不适用于我的 WSL。
有没有其他方法可以让我只输入一次密码?
最佳做法是设置 SSH 密钥对以进行自动身份验证;即创建一个 SSH 密钥对并将 public 密钥复制到这些文件所在的服务器,然后在 rsync 命令中使用私钥:rsync -Pruzh --copy-links -e "ssh -i /path/to/private.key" ...
。这相当简单、安全,并且摆脱了提示。
您也可以使用 sshpass
之类的实用程序在提示中输入密码,但这种方法不太安全。
如果您使用的是 openssh,那么您可以设置一个主连接并通过以下方式重用它:
DEST="${SSH_USER}@server"
TMPL=/tmp/sshctl/"%L-%r@%h:%p"
mkdir -p /tmp/sshctl
if ! ssh -nNf -o ControlMaster=yes -o ControlPath="${TMPL}" "${DEST}"; then
echo "# Failed to setup SSH ControlMaster. Aborting."
exit
fi
# ...
rsync -e "ssh -o 'ControlPath=${TMPL}'" ... "${DEST}":... ...
rsync -e "ssh -o 'ControlPath=${TMPL}'" ... "${DEST}":... ...
# ...
ssh -O exit -o ControlPath="${TMPL}" "${DEST}"
一定要固定插座。
我写了这个脚本:
#!/bin/bash
SSH_USER=${SSH_USER:=$USER}
for department in A B C E L M V
do
mkdir -p ./resources/${div}
rsync -Pruzh --copy-links \
${SSH_USER}@server:${department}/foo/files \
${SSH_USER}@server:${department}/foo/photos \
./resources/${department}/foo
rsync -Pruzh \
${SSH_USER}@server:${department}/bar/documents \
./resources/${department}/bar
done
除了我必须写 14 次密码外,它工作得很好,这不太实用。
我听说过 ssh_agent
,但由于某些原因它不适用于我的 WSL。
有没有其他方法可以让我只输入一次密码?
最佳做法是设置 SSH 密钥对以进行自动身份验证;即创建一个 SSH 密钥对并将 public 密钥复制到这些文件所在的服务器,然后在 rsync 命令中使用私钥:rsync -Pruzh --copy-links -e "ssh -i /path/to/private.key" ...
。这相当简单、安全,并且摆脱了提示。
您也可以使用 sshpass
之类的实用程序在提示中输入密码,但这种方法不太安全。
如果您使用的是 openssh,那么您可以设置一个主连接并通过以下方式重用它:
DEST="${SSH_USER}@server"
TMPL=/tmp/sshctl/"%L-%r@%h:%p"
mkdir -p /tmp/sshctl
if ! ssh -nNf -o ControlMaster=yes -o ControlPath="${TMPL}" "${DEST}"; then
echo "# Failed to setup SSH ControlMaster. Aborting."
exit
fi
# ...
rsync -e "ssh -o 'ControlPath=${TMPL}'" ... "${DEST}":... ...
rsync -e "ssh -o 'ControlPath=${TMPL}'" ... "${DEST}":... ...
# ...
ssh -O exit -o ControlPath="${TMPL}" "${DEST}"
一定要固定插座。