简单的Flask应用程序在远程服务器上执行hostname
并返回结果。唯一安装的软件包是parallel-ssh
和Flask
(下面的pip冻结)。
最后2行可以像普通脚本一样运行它。
from flask import Flask
from pssh.clients.native.single import SSHClient
application = Flask(__name__)
@application.route('/')
def index():
username = 'foo'
password = 'bar'
command = 'hostname'
client = SSHClient('127.0.0.1', user=username, password=password)
run = client.run_command(command)
_, _, stdout, _, _ = run
return '\n'.join(list(stdout))
if __name__ == '__main__':
print(index())
当我使用flask run
或普通脚本运行它时一切正常:
(venv) foo@watchtower segfault $ python crash.py
watchtower
(venv) foo@watchtower segfault $ export FLASK_APP=crash
(venv) foo@watchtower segfault $ flask run &
* Serving Flask app "crash"
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
(venv) foo@watchtower segfault $ http localhost:5000
127.0.0.1 - - [13/Feb/2019 09:44:33] "GET / HTTP/1.1" 200 -
HTTP/1.0 200 OK
Content-Length: 10
Content-Type: text/html; charset=utf-8
Date: Wed, 13 Feb 2019 06:44:33 GMT
Server: Werkzeug/0.14.1 Python/3.6.7
watchtower
(venv) foo@watchtower segfault $
但是在应用程序服务器(Unit,uWSGI)中运行它会导致分段错误:
root@watchtower:~# curl --unix-socket /var/run/control.unit.sock localhost/config -s | jq
{
"listeners": {
"*:9002": {
"application": "segfault"
}
},
"applications": {
"segfault": {
"type": "python 3.6",
"module": "crash",
"processes": 1,
"path": "/home/foo/python/segfault/",
"home": "/home/foo/python/segfault/venv/",
"user": "foo",
"group": "foo"
}
}
}
foo@watchtower segfault $ http localhost:9002 --timeout 5
http: error: Request timed out (5.0s).
foo@watchtower segfault $ tail /var/log/syslog
Feb 13 09:51:14 watchtower systemd[1]: Starting NGINX Unit...
Feb 13 09:51:14 watchtower unitd[12504]: 2019/02/13 09:51:14 [info] 12504#12504 unit started
Feb 13 09:51:14 watchtower systemd[1]: Started NGINX Unit.
Feb 13 09:51:19 watchtower v1.7.1 [/usr/sbin/unitd --log /var/log/unit.log --pid /run/unit.pid]: [alert] 12513#12513 process 12537 exited on signal 11
Feb 13 09:51:19 watchtower kernel: [436188.269128] unitd[12555]: segfault at 10 ip 00007f06515f3205 sp 00007f06479b2d28 error 6 in libcrypto.so.1.1[7f06514a7000+24d000]
foo@watchtower segfault $
环境:
(venv) foo@watchtower segfault $ uname -a
Linux watchtower 4.15.0-45-generic #48-Ubuntu SMP Tue Jan 29 16:28:13 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
(venv) foo@watchtower segfault $ openssl version
OpenSSL 1.1.0g 2 Nov 2017
(venv) foo@watchtower segfault $ python -m pip freeze
asn1crypto==0.24.0
bcrypt==3.1.6
cffi==1.11.5
Click==7.0
cryptography==2.5
Flask==1.0.2
gevent==1.4.0
greenlet==0.4.15
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
parallel-ssh==1.9.1
paramiko==2.4.2
pkg-resources==0.0.0
pyasn1==0.4.5
pycparser==2.19
PyNaCl==1.3.0
six==1.12.0
ssh2-python==0.17.0
Werkzeug==0.14.1
(venv) foo@watchtower segfault $
也是strace:https://pastebin.com/NMHFqizC
这里类似的错误。 parallel-ssh + flask + uWSGI = !!! uWSGI进程14获得了分段错误!
uwsgi(uwsgi_backtrace+0x35) [0x5575850f5a45]
uwsgi(uwsgi_segfault+0x23) [0x5575850f5df3]
/lib/x86_64-linux-gnu/libc.so.6(+0x33060) [0x7ff7adafe060]
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1(EVP_MD_CTX_clear_flags+0x5) [0x7ff7aecf9cd5]
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1(EVP_DigestInit_ex+0x1d) [0x7ff7aecea51d]
/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1(HMAC_Init_ex+0x10f) [0x7ff7aed00fcf]
/usr/local/lib/python3.6/site-packages/ssh2/.libs/libssh2-71649126.so.1.0.1(+0x23144) [0x7ff79b8e2144]
/usr/local/lib/python3.6/site-packages/ssh2/.libs/libssh2-71649126.so.1.0.1(_libssh2_transport_send+0x43e) [0x7ff79b8f6359]
/usr/local/lib/python3.6/site-packages/ssh2/.libs/libssh2-71649126.so.1.0.1(+0x2d9d5) [0x7ff79b8ec9d5]
/usr/local/lib/python3.6/site-packages/ssh2/.libs/libssh2-71649126.so.1.0.1(libssh2_session_handshake+0x2e) [0x7ff79b8ecbab]
/usr/local/lib/python3.6/site-packages/ssh2/session.cpython-36m-x86_64-linux-gnu.so(+0x948f) [0x7ff79ab9a48f]
/usr/local/lib/libpython3.6m.so.1.0(_PyCFunction_FastCallDict+0xf5) [0x7ff7ae178915]
/usr/local/lib/libpython3.6m.so.1.0(+0x166d51) [0x7ff7ae208d51]
/usr/local/lib/libpython3.6m.so.1.0(_PyEval_EvalFrameDefault+0x3195) [0x7ff7ae20c735]
/usr/local/lib/libpython3.6m.so.1.0(+0x16699c) [0x7ff7ae20899c]
/usr/local/lib/libpython3.6m.so.1.0(_PyFunction_FastCallDict+0x12c) [0x7ff7ae21108c]
/usr/local/lib/libpython3.6m.so.1.0(_PyObject_FastCallDict+0x16e) [0x7ff7ae11529e]
/usr/local/lib/libpython3.6m.so.1.0(_PyObject_Call_Prepend+0xbd) [0x7ff7ae11538d]
/usr/local/lib/libpython3.6m.so.1.0(PyObject_Call+0x47) [0x7ff7ae115047]
/usr/local/lib/libpython3.6m.so.1.0(_PyEval_EvalFrameDefault+0x4064) [0x7ff7ae20d604]
/usr/local/lib/libpython3.6m.so.1.0(+0x165f30) [0x7ff7ae207f30]
/usr/local/lib/libpython3.6m.so.1.0(_PyFunction_FastCallDict+0x347) [0x7ff7ae2112a7]
/usr/local/lib/libpython3.6m.so.1.0(_PyObject_FastCallDict+0x16e) [0x7ff7ae11529e]
/usr/local/lib/libpython3.6m.so.1.0(_PyObject_Call_Prepend+0xbd) [0x7ff7ae11538d]
/usr/local/lib/libpython3.6m.so.1.0(PyObject_Call+0x47) [0x7ff7ae115047]
/usr/local/lib/python3.6/site-packages/greenlet.cpython-36m-x86_64-linux-gnu.so(+0x35cf) [0x7ff7a91175cf]
/usr/local/lib/python3.6/site-packages/greenlet.cpython-36m-x86_64-linux-gnu.so(+0x2f76) [0x7ff7a9116f76]
/usr/local/lib/python3.6/site-packages/greenlet.cpython-36m-x86_64-linux-gnu.so(+0x3e13) [0x7ff7a9117e13]
/usr/local/lib/libpython3.6m.so.1.0(_PyCFunction_FastCallDict+0x194) [0x7ff7ae1789b4]
/usr/local/lib/libpython3.6m.so.1.0(+0x166d51) [0x7ff7ae208d51]
/usr/local/lib/libpython3.6m.so.1.0(_PyEval_EvalFrameDefault+0x3195) [0x7ff7ae20c735]
/usr/local/lib/libpython3.6m.so.1.0(+0x165f30) [0x7ff7ae207f30]
/usr/local/lib/libpython3.6m.so.1.0(_PyFunction_FastCallDict+0x347) [0x7ff7ae2112a7]
/usr/local/lib/libpython3.6m.so.1.0(_PyObject_FastCallDict+0x16e) [0x7ff7ae11529e]
/usr/local/lib/libpython3.6m.so.1.0(_PyObject_Call_Prepend+0xbd) [0x7ff7ae11538d]
/usr/local/lib/libpython3.6m.so.1.0(PyObject_Call+0x47) [0x7ff7ae115047]
/usr/local/lib/libpython3.6m.so.1.0(+0x1bb392) [0x7ff7ae25d392]
/usr/local/lib/libpython3.6m.so.1.0(+0x1b4af7) [0x7ff7ae256af7]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7494) [0x7ff7afc37494]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x3f) [0x7ff7adbb3acf]
*** end of backtrace ***
你解决了吗?
编辑:
使用from pssh.clients.miko.single import SSHClient
似乎工作