我正在尝试创建一个脚本,将一组用户批量标记为RT中的特权。我在RT维基上找到了一个脚本,用于将用户添加到组中并为其提供特权状态,然后删除它与添加到组中的位。我剩下的perl脚本是:
#!/usr/bin/perl
# Usage: ./rt_set_privileged.pl <username>
use strict;
use lib "/var/www/ticket.ourcompany.com/lib";
use RT;
use RT::User;
use RT::Interface::CLI;
RT::LoadConfig();
RT::Init();
# Create RT User Object
my $user = new RT::User($RT::SystemUser);
# Instantiate the user object with the user passed as parameter
my $usertoadd = $ARGV[0];
$user->Load( $usertoadd );
# Set the privileged flag (1=privileged, 0=unprivileged)
$user->SetPrivileged(1);
exit 1
我有一个文件中的用户,每行一个用户名。 我还不知道perl,所以我尝试创建一个小的bash脚本来遍历文件并按名称运行perl脚本一次。现在看起来的Bash脚本:
#!/bin/bash
touch commands.sh
cat usernames.txt | while read LINE ; do
N=$((N+1))
echo /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\" >> commands.sh
/home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
perl /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
perl -w /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
eval /home/chris/RT/bin/rt_set_privileged.pl \"$LINE\"
perl "/home/chris/RT/bin/rt_set_privileged.pl $LINE"
done
echo "Processed $N users"
正如你所看到的,我已经尝试了很多方法来运行命令,但无济于事。令人讨厌的是,我可以随后从commands.sh文件中获取任何命令,并将它们直接粘贴到终端没有问题,这很好。当他们通过bash脚本运行时,我只是得到了一堆这些消息:
[Tue Sep 4 07:43:56 2012] [critical]: _AddMember called with a parameter that's not an integer. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:912)
[Tue Sep 4 07:43:58 2012] [warning]: Use of uninitialized value $principal in pattern match (m//) at /var/www/ticket.ourcompany.com/lib/RT/Group.pm line 970. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:968)
[Tue Sep 4 07:43:58 2012] [error]: Group::HasMember was called with an argument that isn't an RT::Principal or id. It's (undefined) (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:973)
[Tue Sep 4 07:43:58 2012] [warning]: Use of uninitialized value $principal in pattern match (m//) at /var/www/ticket.ourcompany.com/lib/RT/Group.pm line 970. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:968)
[Tue Sep 4 07:43:58 2012] [error]: Group::HasMember was called with an argument that isn't an RT::Principal or id. It's (undefined) (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:973)
[Tue Sep 4 07:43:58 2012] [warning]: Use of uninitialized value in concatenation (.) or string at /var/www/ticket.ourcompany.com/lib/RT/User.pm line 341. (/var/www/ticket.ourcompany.com/lib/RT/User.pm:341)
[Tue Sep 4 07:43:58 2012] [critical]: User is neither privileged nor unprivileged. something is drastically wrong. (/var/www/ticket.ourcompany.com/lib/RT/User.pm:341)
[Tue Sep 4 07:43:58 2012] [warning]: Use of uninitialized value $new_member in pattern match (m//) at /var/www/ticket.ourcompany.com/lib/RT/Group.pm line 911. (/var/www/ticket.ourcompany.com/lib/RT/Group.pm:911)
建议在没有任何参数的情况下运行该命令。在这一点上,我可以在我试图解决它的时候为每个用户实际运行一次命令,有人可以帮忙吗?
答案 0 :(得分:2)
在Perl代码中有一堆编程错误 - 您获得的错误消息都是编译器消息。所以调用是正确的,但Perl代码是错误的。
您要做的是编辑Perl代码,直到所有错误消息和警告都消失。
编辑:Perl代码在当时运行的环境中是错误的。
答案 1 :(得分:2)
阿尔,我很难过这么长时间才意识到这么简单的问题。 问题是字符串格式化 - 文件usernames.txt是由某人使用Windows创建并具有dos格式(CRLF)。我猜这个参数是以[用户名] [LF]的形式到达并搞砸了$ User变量的实例化。
我确信如果没有来这里讨论它我就永远不会得到这个,我只是在我自己尝试的时候绕圈子。
决议只是为了:
sudo apt-get install tofrodos
sudo fromdos usernames.txt
然后原始脚本工作
非常感谢帮助人员。
编辑:现在已经有足够的时间将我从原始问题的编辑转移到它自己的答案
答案 2 :(得分:1)
perl /home/chris/RT/bin/rt_set_privileged.pl "$LINE"
如果文件是可执行文件,您也可以这样做:
/home/chris/RT/bin/rt_set_privileged.pl "$LINE"
例如,
$ cat usernames.txt
ikegami
Chris O'Kelly
$ cat script.pl
#!/usr/bin/env perl
print "arg=<<$ARGV[0]>>\n";
$ while read LINE ; do script.pl "$LINE"; done <usernames.txt
arg=<<ikegami>>
arg=<<Chris O'Kelly>>
您可以使用xargs
代替while read
:
$ xargs -n1 -d\\n script.pl <usernames.txt
arg=<<ikegami>>
arg=<<Chris O'Kelly>>
答案 3 :(得分:1)
另一个解决方案:不要使用bash脚本,而是直接编辑perl脚本,打开你的usernames.txt文件并逐行阅读 - 这也将解决你的问题。
就像这里http://www.perlfect.com/articles/perlfile.shtml:
my $file = "usernames.txt";
open USERS, "<$file" or die "Can't open $file ($!)";
while(<USERS>) {
my $usertoadd = $_;
chomp $usertoadd;
$user->Load( $usertoadd );
$user->SetPrivileged(1);
}
答案 4 :(得分:0)
更新: 现在考虑到用户名中空格的可能性,这得益于来自Peniwize's Blog的有价值的提示。
OLD_IFS=$IFS
IFS=$'\n'
priveleged=( $( cat usernames.txt) )
for i in "${priveleged[@]}"
do
perl /home/chris/RT/bin/rt_set_privileged.pl $i
done
IFS=$OLD_IFS