【发布时间】:2016-03-22 23:31:48
【问题描述】:
解密我做什么/我想要什么:
在我们的服务器上远程运行脚本(来自 Ubuntu 14.04、Python 2.7.6、 我想在 Ubuntu 12.04 和 Ubuntu 14.04 上执行脚本)。此脚本将挂载加密卷并设置正确的主机名并确认服务器处于暂存环境中。
我做了什么:
我创建了 EXPECT 脚本(scripts/auto_mounth.sh - 多亏了这个,我能够运行交互式脚本,该脚本会自动输入安装分区的密码,调用主机名并输入并确认服务器处于暂存环境中
-
我创建了 FABRIC 函数
一个。在这个函数中我设置了 env.user & env.password
b.此函数运行操作系统的更新和升级,并复制和运行 EXPECT 脚本(用于挂载加密卷)
import os import sys import time import boto import deployment import getpass import sys env.user = 'my_user' env.password = 'my_sudo_pass" def staging_auto_mount(): # install expect sudo('apt-get update', pty=False) sudo('apt-get -y dist-upgrade', pty=False) sudo('apt-get -y autoclean', pty=False) sudo('apt-get -y install expect', pty=False) # auto mount EBS volume sudo('mkdir -p /scripts/', pty=False) put('scripts/auto_mount.sh', '/scripts/', use_sudo=True, mode=0755) run('/scripts/auto_mount.sh') sudo('rm -rf /scripts/') -
我创建了 BASH 脚本 (/home/scripts/staging_server01.sh) - 我只是输入了这个脚本命令来运行 FABric 函数
cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx
我的问题如下:
当我手动运行它时,一切正常,我可以像运行 BASH 脚本(ad 3.)一样
/home/scripts/staging_server01.sh
或者我可以运行 FABric 函数
cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx
但是当我将它放入 crontab 时出现问题
我如何设置 crontab 作业,我尝试了几件事
08 07 * * * cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx --password='my_SUDO_PASS'
08 07 * * * cd /scripts/ && /usr/local/bin/fab staging_auto_mount -H XXX.xxx.XXX.xxx
08 07 * * * /home/scripts/staging_server01.sh
(在我的本地环境中,我使用具有相同 sudo 权限的同一用户,就像在登台服务器上一样。两个用户都具有相同的 PASS 用于我的测试。我还尝试像特定用户一样在 crontab 作业中运行命令)
在日志中我看到了这个:
/usr/lib/python2.7/getpass.py:83: GetPassWarning: Can not control echo on the terminal.
passwd = fallback_getpass(prompt, stream)
Warning: Password input may be echoed.
我正在考虑使用 SSL 并通过 SSL 远程命令运行,但我们经常恢复服务器,所以我必须经常生成新密钥。所以这不是办法。
我做了一些调查,我重写了我的 FABric 函数,我也被困在这个问题上。老实说,我遇到了更大的代码问题[当我手动或通过 crontab 运行时,我无法创建目录和复制文件(权限问题或日志告诉我目录已经存在)]
import os
import sys
import time
import boto
import deployment
import getpass
import sys
import shutil
import os.path
env.user = 'my_user'
env.password = 'my_sudo_pass'
path = "/home/scripts/"
def staging_auto_mount():
# install expect
os.system("sudo -p " + "env.password" + " apt-get update")
os.system("sudo -p " + "env.password" + " apt-get -y dist-upgrade")
os.system("sudo -p " + "env.password" + " apt-get -y autoclean")
os.system("sudo -p " + "env.password" + " apt-get -y install expect")
通过 crontab 我可以得到这个错误
Message-Id: <20151215212901.3404CA0B02@vm01-ubuntu>
Date: Tue, 15 Dec 2015 15:29:01 -0600 (CST)
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
sudo: no tty present and no askpass program specified
[XXX.xxx.XXX.xxx] Executing task 'staging_auto_mount'
关于上面的错误我尝试在visudo中设置特定的NOPASSWORD权限,但是问题依旧存在
如果有任何帮助,我将不胜感激
【问题讨论】:
标签: python linux bash ubuntu fabric