将grep输出重定向到服务器中的文件

时间:2017-02-17 01:08:14

标签: shell grep sh expect

我正在尝试编写一个脚本,该脚本可以在多个服务器中查找内容,并将所有这些脚本的输出附加到单个文件中。服务器受密码保护。我使用expect进入服务器并传递grep命令,但我希望得到每个服务器的输出最终都在一个文件中。

以下是我想要做的概述:

spawn ssh xxx@server1 expect "password: " send "PASSWORD\r" expect "$ " send "grep <something> /some/log/file >> file.txt" expect "$ " send "exit\r"

...然后继续在几十台服务器上执行此操作,每次都将grep命令的输出附加到file.txt。我不介意file.txt实际上在哪里。它可以在我的本地计算机或任何服务器上。

我提出的最好的方法是将每个文件放在服务器上的文件中,然后将所有这些文件写入本地并将它们全部附加到本地。这看起来非常浪费,所以我正在寻找一种方法将输出发送到服务器或从服务器发送到本地。

2 个答案:

答案 0 :(得分:0)

如果您使用公钥身份验证而不是密码身份验证来访问服务器,那么自动化和更安全都会更容易。然后你可以像这样简单地循环它们:

.ssh/authorized_keys

由于您具有密码访问权限,因此您可以轻松地将公钥放入spawn ssh xxx@server1 expect "password: " send "PASSWORD\r" expect "$ " send "mkdir -p .ssh\r" expect "$ " send "cat >>.ssh/authorized_keys <<EOF" send "(public key goes here)\r" send "EOF\r" expect "$ " send "chmod 0700 .ssh\r" expect "$ " send "chmod 0600 .ssh/authorized_keys\r" expect "$ " send "exit\r" 以首先启用密钥访问。你可以用你期望的脚本来做到这一点:

class ThingView extends Component {
    constructor(props) {
        super(props)
    }
    componentWillMount() {
        this.props.loadThingThenFrames(this.props.id)
    }
    componentDidUpdate(prevProps) {
        console.log("did update")
        if (prevProps.id !== this.props.id) {
            this.props.loadThingThenFrames(this.props.id)
        }
    }
    render() {
        return (
            <div className="container">
                { this.props.isRequesting ? <p>Loading thing...</p> : null}
                <h1> {this.props.thing ? this.props.thing.device_id : "Thing Not Found"} </h1>
                <Timeline frames={this.props.frames} />
            </div>
        )
    }
}

const mapStateToProps = (state, ownProps) => ({
    thing: state.thingView.thing,
    frames: state.thingView.frames,
    id: ownProps.params.id,
    isRequesting: state.thingView.isRequesting,
    requestError: state.thingView.requestError
})

const mapDispatchToProps = (dispatch) => ({
    loadThingThenFrames: (id) => { dispatch(loadThingThenFrames(id)) }
})

答案 1 :(得分:0)

如果出于某种原因,必须使用带密码输入的解决方案,您可以使用func init() { runtime.LockOSThread(); } func main() { // Run loop here. } 附加到以下内容的文件:

expect