小编HTF*_*HTF的帖子

Bash - "if"语句的"和"运算符

我正在尝试创建一个简单的bash脚本来检查网站是否已关闭,并且由于某种原因"and"运算符不起作用:

#!/usr/bin/env bash

WEBSITE=domain.com
SUBJECT="$WEBSITE DOWN!"
EMAILID="an@email.com"
STATUS=$(curl -sI $WEBSITE | awk '/HTTP\/1.1/ { print $2 }')
STRING=$(curl -s $WEBSITE | grep -o "string_to_search")
VALUE="string_to_search"

if [ $STATUS -ne 200 ] && [[ "$STRING" != "$VALUE" ]]; then
        echo "Website: $WEBSITE is down, status code: '$STATUS' - $(date)" | mail -s "$SUBJECT" $EMAILID
fi
Run Code Online (Sandbox Code Playgroud)

"-a"运算符也不起作用:

if [ $STATUS -ne 200 ] -a [[ "$STRING" != "$VALUE" ]]
Run Code Online (Sandbox Code Playgroud)

你能告诉我什么时候使用:

  • 单方括号和双方括号
  • 插入语

bash if-statement

142
推荐指数
5
解决办法
32万
查看次数

BASH:在一行上打印输出

我在下面有这个简单的脚本来并行地将压缩的MySQL转储流式传输到Amazon S3存储桶:

#!/bin/bash

COMMIT_COUNT=0
COMMIT_LIMIT=2

for i in $(cat list.txt); do

        echo "$i "

        mysqldump -B $i | bzip2 -zc | gof3r put -b s3bucket -k $i.sql.bz2 &


        (( COMMIT_COUNT++ ))

        if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]; then
        COMMIT_COUNT=0
        wait
        fi

done

if [ ${COMMIT_COUNT} -gt 0 ]; then
        wait
fi
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

database1 
database2 
duration: 2.311823213s
duration: 2.317370326s
Run Code Online (Sandbox Code Playgroud)

有没有办法在每个转储的一行上打印这个?

database1 - duration: 2.311823213s
database2 - duration: 2.317370326s
Run Code Online (Sandbox Code Playgroud)

echo -n在这种情况下,开关没有帮助.

编辑:5月6日星期三15:17:29 BST 2015

我能够根据公认的答案达到预期的结果:

echo "$i -" $(mysqldump -B $i| …
Run Code Online (Sandbox Code Playgroud)

bash

20
推荐指数
2
解决办法
4114
查看次数

循环 - 进程替换与此处字符串与命令替换

有人可以解释这两个while循环之间的区别:

while read test; do
echo $test
done <<< "$(seq 5)"
Run Code Online (Sandbox Code Playgroud)

-

while read test; do
echo $test
done < <(seq 5)
Run Code Online (Sandbox Code Playgroud)

bash while-loop

6
推荐指数
1
解决办法
2070
查看次数

Django在POST请求后设置表单字段

我正在使用基于类的视图(FormView),我希望在提交表单后保留搜索关键字(POST请求).我在form_valid方法中尝试了这个:

def form_valid(self, form):
        self.initial['search'] = form.data['search']
        ...
Run Code Online (Sandbox Code Playgroud)

但这将为所有用户显示.这是许多网络搜索表单(更不用说谷歌搜索)的常见解决方案,所以我想知道如何在Django中完成这项工作.

更新:2017年6月19日星期一13:18:42 UTC

基于下面的一些答案,我将不得不重新解释我的问题.

我有一个带有几个输入字段的简单表单,在提交表单后,它将查询其他网站以根据搜索字词获得结果.我想将一些结果存储到数据库中,主要是为了生成统计数据,用选定的字段重新显示表单并显示结果.

目前,数据驻留在一个类对象上,并从POST传递给GET.出于明显的安全原因,这不是一个好的解决方案:

class SearchView(FormView):
    ...
    data = dict()

    def form_valid(self, form):
        ....
        self.data['results'] = results

    def get_context_data(self, **kwargs):
        context = super(IndexView, self).get_context_data(**kwargs)
        context['data'] = self.data.pop('results', None)
        return context
Run Code Online (Sandbox Code Playgroud)

题:

在同一页面上显示表单(包含所选字段)和结果的最佳方法是什么,最好不使用会话或在POST和GET之间将它们存储在数据库中.

我已经考虑过的要点:

  1. 不要重定向用户(立即使用当前上下文呈现模板,而我们仍然有响应对象) - 我不喜欢页面刷新将重新提交表单的事实.

  2. 将响应保存到像Redis这样的键值存储中,并将用户重定向到结果/ {result_id},我们可以从数据库中检索响应以预先填充表单中的数据并显示结果 - 这听起来很合理但我为了将结果从POST传递给GET,我们必须添加另一个组件.

  3. 对这种类型的表单使用GET - 我的理解是我们应该使用POST进行数据修改

django

6
推荐指数
2
解决办法
3405
查看次数

如何访问 zipapp 中的文件

我使用以下命令构建了一个简单的 Python zipapp :

\n\n
python -m pkg/ -c -o test -p \'/usr/bin/python3\' -m \'test:main\' zipapp\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想从脚本访问二进制文件

\n\n
$ cat pkg/test.py \ndef main():\n    with open(\'test.bin\', \'rb\') as f:\n        print(f.name)\n
Run Code Online (Sandbox Code Playgroud)\n\n

目录结构

\n\n
$ tree pkg/\npkg/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test.bin\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py\n\n0 directories, 2 files\n
Run Code Online (Sandbox Code Playgroud)\n\n

但看起来该脚本引用了当前目录中的一个文件:

\n\n
$ ./test \nTraceback (most recent call last):\n  File "/usr/lib64/python3.7/runpy.py", line 193, in _run_module_as_main\n    "__main__", mod_spec)\n  File "/usr/lib64/python3.7/runpy.py", line 85, in _run_code\n    exec(code, run_globals)\n  File "./test/__main__.py", line 3, in <module>\n  File "./test/test.py", line 2, in main\nFileNotFoundError: [Errno …
Run Code Online (Sandbox Code Playgroud)

python ziparchive

6
推荐指数
1
解决办法
1570
查看次数

YUM从包中重新安装原始文件

我正在尝试在CentOS上重新安装一个软件包:yum reinstall packagename但是我仍然可以看到我在这个软件包的配置文件中所做的更改.

有没有办法强制重新加载包及其配置文件?

问候

centos yum

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

Python:Pyppeteer 点击弹出窗口

我正在尝试在此页面上生成的弹出窗口上接受 cookie 同意。我尝试使用,waitForSelector但我使用的所有选择器似乎对无头浏览器都是可见的。我想实际切换到“是”,然后提交表单。我想它是显示出来的,window.onload所以也许这需要在 JavaScript 中完成?

import asyncio
import time

from pyppeteer import launch
from pyppeteer.errors import TimeoutError
from urllib.parse import urlparse

URLS = [
    'https://www.trustarc.com/'
]

start = time.time()

async def fetch(url, browser):
    page = await browser.newPage()
    try:
        #await page.setRequestInterception(True)
        page.on('request', callback)
        await page.goto(url, {'waitUntil': 'networkidle0'})
        await page.screenshot({'path': f'img/{urlparse(url)[1]}.png', 'fullPage': True})
    except TimeoutError as e:
        print(f'Timeout for: {url}')
    finally:
        await page.close()


async def callback(req): 
    print(f'Request: {req.url}')

async def run():
    browser = await launch(headless=True, args=['--no-sandbox']) …
Run Code Online (Sandbox Code Playgroud)

python puppeteer pyppeteer

5
推荐指数
2
解决办法
4525
查看次数

Python:在pyppeteer中保持打开浏览器并创建CDPSession

我有两个我暂时无法解决的问题。

1.我想使浏览器保持运行状态,以便我可以使用pyppeteer.launcher.connect()function 重新连接,但是即使我不致电,它似乎也被关闭了pyppeteer.browser.Browser.close()

test01.py:

import asyncio

from pyppeteer import launch, connect

async def fetch():
    browser = await launch(
        headless=False,
        args=['--no-sandbox']
    )
    print(f'Endpoint: {browser.wsEndpoint}')
    await browser.disconnect()

loop = asyncio.get_event_loop()
loop.run_until_complete(fetch())

$ python test01.py
Endpoint: ws://127.0.0.1:51757/devtools/browser/00e917a9-c031-499a-a8ee-ca4090ebd3fe
$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" http://127.0.0.1:51757
curl: (7) Failed to connect to 127.0.0.1 port 51757: Connection refused
Run Code Online (Sandbox Code Playgroud)

2.如何创建CDP会话。此代码应打开另一个浏览器窗口,但不能按预期工作:

test02.py

import asyncio
import time

from pyppeteer import launch, connect

async def fetch():
    browser = await launch( …
Run Code Online (Sandbox Code Playgroud)

python pyppeteer

5
推荐指数
1
解决办法
724
查看次数

带类型提示的默认函数参数与可选函数参数

因此,该函数gendata接受两个可选参数(namesource),然后基于具有该函数所需的相同参数的source调用值。parser

  1. 解决必需参数与非必需参数的推荐方法是什么?
  2. Python 文档中有一个关于typing.Types的示例,它表明Type[SuperClass]应该接受从它继承的所有子类。为什么mypy在这种情况下会抱怨,为什么只针对 arg 1 和 2 而不是 3 ( source)?

例如:

from dataclasses import dataclass
from typing import List, Optional, Type


@dataclass
class BaseItem:
    name: str
    value: int


@dataclass
class Item(BaseItem):
    pass


@dataclass
class AnotherItem(BaseItem):
    pass


def parser(item: Type[BaseItem], name: str, source: int) -> Type[BaseItem]:
    item.value = source
    return item


def gendata(
    items: List[Item], name: Optional[str] = None, source: Optional[int] = None …
Run Code Online (Sandbox Code Playgroud)

python type-hinting type-annotation

5
推荐指数
1
解决办法
6597
查看次数

数据转换/映射的最佳方法

任务是将字段从一个数据集映射到另一个数据集,某些字段需要一些额外的解析/计算。

(我在下面提供的示例中只使用了几个字段,但原始数据集中有更多字段)。

方法一:

最初我虽然使用 dict 进行字段映射,只是将函数分配给需要额外数据操作的键:

import base64
import hashlib
import json

from datetime import datetime


def str2base64(event):
    md5 = hashlib.md5(event['id'].encode())
    return base64.b64encode(md5.digest())


def ts2iso(event):
    dt = datetime.fromtimestamp(event['timestamp'])
    return dt.isoformat()


MAPPINGS = {
    'id': id2hash,
    'region': 'site',
    'target': 'host',
    'since': ts2iso
}


def parser(event):
    new = dict()
    for k, v in MAPPINGS.items():
        if callable(v):
            value = v(event)
        else:
            value = event.get(v)
        new[k] = value
    return new


def main():
    for event in events:  # dicts
        event = parser(event)
        print(json.dumps(event, indent=2))


if …
Run Code Online (Sandbox Code Playgroud)

python oop properties data-conversion

5
推荐指数
1
解决办法
210
查看次数