我有一个bash脚本,我用它来迁移从配置文件中读取的一些IMAP邮件帐户。
它适用于单行条目,但是当我有多个帐户时,只有第一个条目有效,其余条目由于某种原因删除了用户名的第一个字符。我用来暂停和等待击键的命令也没有暂停。 (我可以调试那部分,但如果我不需要,我肯定会投票给你!)
我99%肯定我的问题是我唯一不完全理解的问题:
CREDS=(${VAR// / })
另外值得注意的是密码塞满了特殊字符,但没有空格。这是代码:
#! /bin/bash
# Script to help migrate email account contents
# must have accounts all ready set up and using IMAP
# uses hardcoded dovecot master user on host2 too bad host1 is stupid courier
# uses file mailusers.cfg for users and passwords
# one entry per line - format is:
# username@domain.com passwordstring
while read p; do
VAR=$p
CREDS=(${VAR// / })
VARUSER=${CREDS[0]}
VARPASS=${CREDS[1]}
OUTPUT="Username: $VARUSER Password: $VARPASS"
echo $OUTPUT
imapsync --host1 123.456.789.123 --user1 $VARUSER --password1 $VARPASS --authmech1 PLAIN --host2 999.888.777.123 --user2 $VARUSER*masteruser@mydomain.com --password2 notreallypasswordXD --authmech2 PLAIN --exclude 'Trash|Spam'
echo "Done!"
echo
read -n 1 -s
done < mailusers.cfg
注意:此脚本不应在其他用户登录的系统上运行,因为如果他们碰巧运行ps aux我会相信,他们可以看到用户名/密码。有关详细信息,请参阅imapsync文档。
答案 0 :(得分:3)
您缺少用户名的第一个字符的原因与暂停不起作用的原因完全相同:暂停(read -n 1 -p
)从stdin
读取一个字符。但是,stdin
已重定向到数据文件,因此它会读取用户名的第一个字符。
你真的需要在扩展中引用变量。养成这样做的习惯。它更安全。
我不知道替换线的作用是什么:当你呈现它时,它看起来像一个无操作但我想它可能是其中一个空格是一个标签。无论如何,这是不必要的。你可以用shell变量替换所有这些傻瓜:
while read -r VARUSER VARPASS ignore_rest_of_line; do
echo "Username: $VARUSER Password: $VARPASS"
imapsync --host1 123.456.789.123 --user1 "$VARUSER" \
--password1 "$VARPASS" --authmech1 PLAIN \
--host2 999.888.777.123 \
--user2 "$VARUSER*masteruser@mydomain.com" \
--password2 notreallypasswordXD \
--authmech2 PLAIN --exclude 'Trash|Spam'
echo "Done!"
echo
read -n 1 -s < /dev/tty
done < mailusers.cfg
答案 1 :(得分:0)
正如所指出的,您可以将输入read -n 1 -s
重定向到/dev/tty
,但另一种方法是为输入文件使用不同的文件描述符:
while read -u 4 p; do
VAR=$p
CREDS=(${VAR// / })
VARUSER=${CREDS[0]}
VARPASS=${CREDS[1]}
OUTPUT="Username: $VARUSER Password: $VARPASS"
echo $OUTPUT
imapsync --host1 123.456.789.123 --user1 $VARUSER --password1 $VARPASS --authmech1 PLAIN --host2 999.888.777.123 --user2 $VARUSER*masteruser@mydomain.com --password2 notreallypasswordXD --authmech2 PLAIN --exclude 'Trash|Spam'
echo "Done!"
echo
read -n 1 -s
done 4< mailusers.cfg
我认为这一行
CREDS=(${VAR// / })
与
没什么不同 CREDS=($VAR)
并且也更好
read -ra CREDS <<< "$VAR"
因为它阻止了路径名扩展。