我用一个小模块包装了Perl的Net :: SSH :: Expect,以减少编写用于HP iLO卡的新配置脚本所需的样板代码.虽然我一方面希望这个包装器尽可能精简,但非程序员同事可以使用它,我也希望它尽可能好地编写.
它的使用方式如下:
my $ilo = iLO->new(host => $host, password => $password);
$ilo->login;
$ilo->command("cd /system1");
$ilo->command("set oemhp_server_name=$system_name", 'status=0');
Run Code Online (Sandbox Code Playgroud)
这是iLO::command():
sub command {
my ($self, $cmd, $response) = @_;
$response = 'hpiLO-> ' unless defined($response);
# $self->{ssh} is a Net::SSH::Expect object
croak "Not logged in!\n" unless ($self->{ssh});
$self->{ssh}->send($cmd);
if ($self->{ssh}->waitfor($response, $self->{CMD_TIMEOUT}, '-re')) {
return {
before => $self->{ssh}->before(),
match => $self->{ssh}->match(),
after => $self->{ssh}->after(),
};
} else {
carp "ERROR: '$cmd' response …Run Code Online (Sandbox Code Playgroud) 我们有一个简陋的旧版Windows应用程序(已在此处进行了讨论),该应用程序将内容从Windows主机复制到许多Linux主机。我们在几个盒子上运行它的几个实例。每个实例都有其自己的.ini文件,其中包含列表目标服务器。通常,我们经常需要更改这些文件的内容并重新启动该过程,该过程由我们的操作团队手动完成。我想用一个简单的基于Web的实用程序(在Linux主机上运行)代替它,该实用程序允许用户生成配置文件,将其发送到主机并重新启动服务。生成文件很容易-我可能会使用Perl和Template Toolkit-并且由于服务器导出其配置目录,因此复制数据也相对容易。
我有哪些重启Windows服务的选项?Win32::Service?我还没有机会看得很远,所以如果您说“ x::y让这变得容易,但要注意z”,您会节省很多时间。可能吗 另外,也许您可以提出一种更好的方法来解决此问题(可悲的是,替换软件不是一个!)我并不是在偷懒,只是要避免浪费时间摆弄那些可能无法实现我想要的功能的模块。
我们有一个非常古老的,不受支持的程序,它可以跨SMB共享文件.它有一个校验和算法,用于确定在复制之前文件内容是否已更改.该算法似乎很容易上当 - 我们只是发现了一个例子,其中两个文件,除了一个"1"改为"2"完全相同,返回相同的校验和.这是算法:
unsigned long GetFileCheckSum(CString PathFilename)
{
FILE* File;
unsigned long CheckSum = 0;
unsigned long Data = 0;
unsigned long Count = 0;
if ((File = fopen(PathFilename, "rb")) != NULL)
{
while (fread(&Data, 1, sizeof(unsigned long), File) != FALSE)
{
CheckSum ^= Data + ++Count;
Data = 0;
}
fclose(File);
}
return CheckSum;
}
Run Code Online (Sandbox Code Playgroud)
我不是一个程序员(我是一个系统管理员),但我知道基于XOR的校验和将非常粗糙.对于具有不同内容的两个相同大小的文件,此算法返回相同校验和的可能性是多少?(我不期待一个确切的答案,"远程"或"非常可能"是好的.)
如果没有巨大的性能影响,它怎么能改进?
最后,这是怎么回事fread()?我快速扫描了文档,但我无法弄清楚.是Data依次设置文件的每个字节?编辑:好的,所以它正在读取文件unsigned long(让我们假设这里有32位操作系统)块.每个块包含什么?如果文件的内容是abcd,Data第一遍的值是多少?是(在Perl中):
(ord('a') << 24) & (ord('b') << 16) & …Run Code Online (Sandbox Code Playgroud) 我试图通过将新Date对象传递给data()函数,然后join()更新页面,使 D3 每秒更新一次 SVG 元素。我实际上是在一个Observable笔记本中使用的,Promises.tick()但我认为下面的代码(完整源代码)是相关位的粗略近似。我的最终目标是制作一个时钟,但这里的代码是我遇到的问题的最小演示。
这段代码的问题在于从未调用过updatein 函数join()——每次循环时enter都会调用该函数,这会导致text每次都追加一个新的函数。由于我有一个数据和一个元素,我希望join'supdate被调用,而不是enter. 我知道data()( example )上的 key 函数对于确定更改的内容很重要,但我的理解是默认键是数组索引,此处应始终为 0。无论如何,指定不同的键函数(从身份函数到返回常量)都没有帮助。
while (true) {
var data = [new Date()];
svg
.append("g")
.attr("transform", "translate(" + margin.left + "," + margin.top + ")")
.selectAll("text")
.data(data)
.join(
enter => enter.append("text").text(d => "enter: " + d),
update => update.text(d => "update: " + d) …Run Code Online (Sandbox Code Playgroud)