标签: scripting

回声 $? 远程执行时不起作用

当我执行如下命令时,它会按预期给我一个输出,但是当我在远程服务器上运行相同的命令时,它总是给我echo $?作为0.

locally
# <some command>
# echo $?

Remotely
# ssh server " <some command >; echo $? "
Run Code Online (Sandbox Code Playgroud)

现在,在远程执行的情况下,我总是得到0的echo $?输出。

scripting bash shell-scripting

3
推荐指数
1
解决办法
824
查看次数

ssh-agent 行为的差异

似乎我在配置的两个帐户的 ssh-agent 行为之间存在一些差异。

我编写了一个简单的监控脚本来检查我们正在运行的某些 VM 的可用性。我使用我的主要访问帐户进行了所有测试和调试。在此过程中,我生成了一个 SSH 密钥对,启动了 ssh-agent,并将身份添加到代理中,以允许脚本在不需要密码的情况下进行 ssh。

现在,我想以服务帐户用户身份运行此脚本。我创建了服务帐户,并生成密钥,将登录 shell 临时设置为 /bin/bash。我生成了我的密钥,删除了密码,并将身份添加到代理中。

差异似乎与外壳如何连接到代理有关。在我的用户帐户中,自从我开始测试(大约两周)以来,我没有重新启动代理。但是,当我尝试在服务帐户下运行脚本时,似乎每次都必须重新启动代理,添加身份,然后执行工作。

理想情况下,我希望代理无限期运行并让服务帐户在脚本运行时自动重新连接到它,这样我就不需要在脚本中管理进程。我查看了每个帐户的配置,没有发现任何差异。任何见解将不胜感激。

**编辑:我忘了指出代理确实持续运行,但服务帐户的 shell 进程似乎没有使用它,必须启动一个新的进程:

ovmmon   14043  0.0  0.0  53916   204 ?        Ss   May17   0:00 ssh-agent
ovmmon   14952  0.0  0.0  53916   204 ?        Ss   May17   0:00 ssh-agent
Run Code Online (Sandbox Code Playgroud)

scripting linux ssh ssh-agent

3
推荐指数
1
解决办法
280
查看次数

获取 WINS 服务器统计信息

我知道 WINS 是古老的。不用提醒我。就其价值而言,这项努力将致力于一个将其完全从环境中淘汰的项目。

但在此之前 - 我需要能够以脚本方式或以编程方式从中收集统计信息。

请看下面的截图:

在此处输入图片说明

看到“Total querries”,(在拼写错误时大声笑)“Record found”等?

我如何获得这些值?它们不在 Perfmon 中,也不在我发现的任何 WMI 类中。我找不到任何相关的 COM 对象。有像“查询/秒”这样的计数器,但我不关心查询/秒。我想要全部查询。就像上面的截图一样。

如果必须的话,我将 P/Invoke Win32...只是...我从哪里获得这些指标?

scripting windows wins

3
推荐指数
1
解决办法
269
查看次数

如果条件比较无法与相同值字符串进行比较,则 Shell 脚本命令输出

我正在合并一个脚本片段,它通过以下方式确定 Android 版本: adb shell getprop ro.build.version.release 返回:4.1.2或4.0.4

该代码段目前如下所示:

if [ "$(adb shell getprop ro.build.version.release)" == "4.1.2" ]; then
    rw_path="/sdcard/"
elif [ "$(adb shell getprop ro.build.version.release)" == "4.0.4" ]; then
    rw_path="/data/local/"
fi
echo $rw_path
Run Code Online (Sandbox Code Playgroud)

我认为 adb 可能会通过 stderr 返回值,就像它使用推/拉输出一样,所以我也尝试了这个(但不确定这是否是正确的方法):

if [ "$(adb shell getprop ro.build.version.release 2>&1)" == "4.1.2" ]; then
    rw_path="/sdcard/"
elif [ "$(adb shell getprop ro.build.version.release 2>&1)" == "4.0.4" ]; then
    rw_path="/data/local/"
fi
echo $rw_path
Run Code Online (Sandbox Code Playgroud)

尝试了 -eq 运算符而不是 ==,但它警告“预期为整数表达式”。

然后我尝试了这个以确保它确实比较了一些东西:

version=$(adb shell getprop ro.build.version.release 2>&1)
if …
Run Code Online (Sandbox Code Playgroud)

scripting unix shell bash

3
推荐指数
1
解决办法
8950
查看次数

Postfix:将电子邮件的副本传递给脚本,但将原始副本传递到邮箱

其实很简单:我想将所有收到的电子邮件传递给一个 PHP 脚本,但只是作为副本,原始电子邮件仍应照常发送到邮箱。

我似乎无法让它工作。我试过以下

(1)创建一个catchall-alias(mysql):

@mydomain.tld   pipe@mydomain.tld
Run Code Online (Sandbox Code Playgroud)

(2)在/etc/postfix/mailpipe.cf中创建regex-transport映射(基本意思是:适用于mydomain.tld的所有邮件)

/.*@mydomain\.tld/   mailpipe:
Run Code Online (Sandbox Code Playgroud)

(3)将其全部集成在 /etc/postfix/main.cf 中:

transport_maps = ... regexp:/etc/postfix/mailpipe.cf
virtual_alias_maps = proxy:mysql:/etc/postfix/....
Run Code Online (Sandbox Code Playgroud)

(4)将传输添加到/etc/postfix/master.cf:

mailpipe   unix  -       n       n       -       -       pipe
  flags=FR user=localuser argv=/path/to/my/script.php
  ${nexthop} ${user}
Run Code Online (Sandbox Code Playgroud)

剧本:

#!/usr/bin/php -q
<?php
  $file = '/home/localuser/pipe/log.log';
  $input = file_get_contents('php://input');
  file_put_contents($file, $input, FILE_APPEND | LOCK_EX);
Run Code Online (Sandbox Code Playgroud)

所以设置似乎有效,脚本在传入的电子邮件中被命中,但它$input是空的(尽管适用于任何其他字符串)。正在处理电子邮件,然后将其删除/丢弃。所以这是我的两个问题:

  1. 如何从脚本访问电子邮件的内容?

  2. 如何防止电子邮件在处理后被丢弃?有没有办法像往常一样将一个副本传递到收件箱,另一个传递给脚本进行处理?

email scripting postfix pipe sieve

3
推荐指数
1
解决办法
6836
查看次数

Powershell:单个脚本来“清理”多个文件夹的旧文件

我想创建一个维护脚本,该脚本将在我们的每台服务器上运行以清除常见的 drop/archive 目录。脚本最好将参考文件用于文件夹路径和所需的时效限制。然后脚本将清除超过老化限制的文件路径。输入参考文件如下所示:

c:\logs\iis\siteA\ 30
c:\logs\job1\ 60
e:\archive\clientA\ 90
Run Code Online (Sandbox Code Playgroud)

第一个组件是文件路径;第二个是文件应该保留的天数,用空格隔开。

现在对于脚本,我有以下内容;然而,我尴尬地缺乏脚本经验。(我更注重网络)

#Attempted loop
Foreach ($ParentDir = Get-Content .\paths.txt $arg1, $arg2)
{$limit = (Get-Date).AddDays(-$arg2)
$path = $ParentDir

# Delete files older than the $limit.
Get-ChildItem -Path $path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit } | Remove-Item -Force}
Run Code Online (Sandbox Code Playgroud)

我觉得逻辑很接近,但我的语法关闭了。我的方法可行吗?有没有更好的办法?你能帮忙解释一下语法吗?使用 poweshell v3。

我从这篇文章中从deadlydog那里得到了很多逻辑。

scripting windows powershell filesystems powershell-v3.0

3
推荐指数
1
解决办法
2万
查看次数

shell脚本中文件名的年月日

我有像下面这样的文件名

adn_DF9D_20140515_0001.log
adn_DF9D_20140515_0002.log
adn_DF9D_20140515_0003.log
adn_DF9D_20140515_0004.log
adn_DF9D_20140515_0005.log
adn_DF9D_20140515_0006.log
adn_DF9D_20140515_0007.log
Run Code Online (Sandbox Code Playgroud)

我想从文件名中获取年、月、日并创建目录

前任: [[ ! -d "$BASE_DIR/$year/$month/$day" ]] && mkdir -p "$BASE_DIR/$year/$month/$day";

如何实现这一目标并分享您的想法/脚本

scripting awk shell-scripting

3
推荐指数
1
解决办法
2457
查看次数

带有脚本的 DNS 服务器

我想知道是否有任何方法可以让 Linux 上的 DNS 服务器运行脚本并根据返回的脚本数据回复不同的 IP 列表。

我在 Google 上搜索了“带脚本的 DNS 服务器”,但一无所获。

编辑:我想根据请求 IP 返回不同的 IP 列表,并在此处找到答案:https : //stackoverflow.com/questions/774490/dns-resolving-based-on-client-ip 和 @Rex 告诉我地理域名系统。

我将其打开以防万一有人有“DNS 脚本”答案,让其他人知道。

domain-name-system scripting linux centos dns-server

3
推荐指数
1
解决办法
733
查看次数

将 curl 与 cookie 结合使用

我希望有人可以帮助我解决这个问题。我已经尝试了一段时间了,有各种各样的变化,似乎无法让它发挥作用。

我正在尝试编写一种方法来登录https://login.three.ie/以从 */My_account_balance 检查帐户余额

我已经尝试了各种 wget 命令,但从我读到的内容来看,curl 更有可能完成这项任务。

我一直在尝试我在网上遇到的变体,包括从这里开始的 stackoverflow,但似乎没有任何效果。

这是我尝试的最后一个:

    curl -X POST -c cookies.txt -u "Uern@me:P@ssw0rd" https://login.three.ie/
Run Code Online (Sandbox Code Playgroud)

这确实将 cookie 文件保存在此处:

    $ cat cookies.txt

    Netscape HTTP Cookie File

    #http://curl.haxx.se/docs/http-cookies.html
    This file was generated by libcurl! Edit at your own risk.
    HttpOnly_login.three.ie        FALSE   /       FALSE   1433988274
    laravel_session eyJpdiI6IkFZWmxvZ2oyXC9NNGVIbHVpejZwRWp3PT0iLCJ2YWx1ZSI6Imxkd25UKzBoMldiQlhYZVJnVUpuNUVsblZ1cGJYZWcwM2E1bTtIWHRiQ2pwV0VwemJ4NFlYcDlzTndSeFRNanpwdDhMMTIrS2RGZGdGd0RNZU1yREJ3PT0iLCJtYWMiOiI0NWUwYzc1TY4ODI3ZmY3ODY5NjliODkxODMyODIzMjQwNmNkNjljNTE2NzQxNmQ4MzhhNDljNTdjM2QwZGY1In0%3D
Run Code Online (Sandbox Code Playgroud)

但是当我尝试重新使用 cookie 时,它​​看起来像是重定向或其他东西,因为这就是我得到的:

    $ curl -b cookies.txt  https://my3account.three.ie/My_account_balance
    <html><head><title>302 Moved Temporarily</title></head>
    <body bgcolor="#FFFFFF">
    <p>This document you requested has moved temporarily.</p>
    <p>It's now at <a href="https://sso.three.ie/mylogin//login?auth-        
    required=seamless&amp;service=https&#37;3A&#37;F&#37;                   
    2Fmy3account.three.ie&#37;2FMy_account_balance">https://sso.three.ie/mylogin//login?auth-required=seamless&amp;service=https&#37;3A&#37;2F&#37;2Fmy3account.three.ie&#37;2FMy_account_balance</a>.</p>
Run Code Online (Sandbox Code Playgroud)

我不明白这里发生了什么。有没有人知道出了什么问题,或者更好,如何解决这个问题?

谢谢

scripting bash wget curl shell-scripting

3
推荐指数
1
解决办法
3万
查看次数

获取属于 Cassandra 集群的节点列表的最佳方法是什么?

我正在为我操作的一些 Cassandra 集群创建一些脚本。其中一些脚本需要属于集群一部分的节点列表。

nodetool status将打印节点列表及其当前状态,但它打印出的信息比我需要的要多。例如:

$ nodetool status mykeyspace
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address      Load       Tokens  Owns    Host ID                               Rack
UN  10.11.12.13  47.66 KB   1       33.3%   aaa1b7c1-6049-4a08-ad3e-3697a0e30e10  rack1
UN  10.11.12.14  47.67 KB   1       33.3%   1848c369-4306-4874-afdf-5c1e95b8732e  rack1
UN  10.11.12.15  47.67 KB   1       33.3%   49578bf1-728f-438d-b1c1-d8dd644b6f7f  rack1
Run Code Online (Sandbox Code Playgroud)

节点列表应该只是 IP(不需要主机名),我想要像下面这样的干净输出:

10.11.12.13
10.11.12.14
10.11.12.15
Run Code Online (Sandbox Code Playgroud)

最好/最简单的方法是什么?

我将在下面提供我当前的方法来执行此操作,但如果有更好的方法,我很乐意看到它。即使它不使用nodetool命令。

scripting cassandra nodetool

3
推荐指数
1
解决办法
7482
查看次数