删除第一个字母的Bash脚本

时间:2013-09-13 17:14:28

标签: bash

我有一个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文档。

2 个答案:

答案 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"

因为它阻止了路径名扩展。