解密我做什么/我想要什么:
在我们的服务器上远程运行脚本(来自 Ubuntu 14.04、Python 2.7.6、 我想在 Ubuntu 12.04 和 Ubuntu 14.04 上执行脚本)。此脚本将安装加密卷并设置正确的主机名并确认服务器处于暂存环境中。
我做了什么:
我创建了 EXPECT 脚本 (scripts/auto_mounth.sh - 多亏了这个,我能够运行交互式脚本,它会自动输入挂载分区的密码,调用主机名并输入它并确认服务器处于临时环境中
我创建了 FABRIC 函数
一个。在这个函数中我设置了 env.user & env.password
此函数运行操作系统的更新和升级,复制并运行 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 脚本(广告 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 权限的相同用户,就像在临时服务器上一样。两个用户都具有相同的测试通过。我还尝试像特定用户一样在 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 远程命令运行,但我们经常恢复服务器,所以我不得不经常生成新 key 。所以这不是办法。
我做了一些调查并重写了我的 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权限,但问题仍然存在
如果有任何帮助,我将不胜感激
最佳答案
here建议使用 -S
选项:
echo <password> | sudo -S apt-get smth
sudo -S
从标准输入读取密码。
here是关于从 /etc/sudoers
文件
Defaults requiretty
的建议
关于python - 用于更新远程服务器的 FABRIC 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318647/