通过一些脚本在多台机器的目录下创建一个文件?
create a file under a directory in multiple machines through some script?
我必须在特定目录下创建一个文件 functon.txt
,其中包含许多机器中的 hello world
。到目前为止,这就是我手动登录每个框并创建文件的操作。该目录归 root
所有,所以我必须确保新文件也归 root
用户所有。
david@machineA:~$ sudo su
[sudo] password for david:
root@machineA:/home/david# cd /opt/Potle/ouyt/wert/1
root@machineA:/opt/Potle/ouyt/wert/1# vi functon.txt
root@machineA:/opt/Potle/ouyt/wert/1# ssh david@machineB
david@machineB:~$ sudo su
[sudo] password for david:
root@machineB:/home/david# cd /opt/Potle/ouyt/wert/1
root@machineB:/opt/Potle/ouyt/wert/1# vi functon.txt
root@machineB:/opt/Potle/ouyt/wert/1# ssh david@machineC
.....
现在我必须在大约 200 台机器上执行此操作。有什么办法可以通过一些脚本来完成这些事情吗?如果必须的话,我可以多次输入密码,但我不想手动登录这些框并手动执行所有其他步骤。
我有一个文件 hosts.txt
,其中逐行包含每台机器。我可以逐行阅读此文件并执行上述操作,但我不确定如何操作?
这对我来说只是一次练习,所以任何简单或简单的方法都可以。我什至可以在脚本中硬编码我的密码来完成这项工作。完成此任务的最佳方法是什么?
安装 Ansible 后:
ansible -i /path/to/hosts.txt -m ping -u david --ask-pass all
看看能不能ping通机器。如果成功,则在 2 台机器上尝试以下操作(创建另一个只有 2 台机器的 txt 文件并将其传递给 -i
选项)。然后你可以 运行 这适用于所有机器。如果该目录不存在,命令将失败,您将看到失败的机器摘要。
ansible -i /path/to/hosts.txt -m copy -a "src=/path/to/functon.txt dest=/opt/Potle/ouyt/wert/1/functon.txt" -u david --ask-pass --become --become-user root --ask-become-pass all
我没有测试这个。所以谨慎使用。
-i
: 输入主机
-m
: 模块
-a
:模块参数
-u
:用户
--ask-pass
: 询问用户密码
--become
: 成为另一个用户
--become-user
: 新用户
--ask-become-pass
: 要求成为用户密码
您可以使用 expect
自动执行 SSH 复制/SSH 登录:
#!/usr/bin/expect
set password [lindex $argv 1]
spawn scp -P 22 [lindex $argv 2] [lindex $argv 0]
expect "*password:*"
send -- "$password\r"
send -- "\r"
expect eof
expect
命令将等待您在参数中提供的字符串被接收。
您可以从 hosts.txt
和 运行 遍历您的主机,此脚本对每个主机都是这样的:
./create_config.sh david@machineA:/opt/Potle/ouyt/wert/1/ somePassword functon.txt
如果您无法进行 SSH 复制而只能进行 SSH,您仍然可以使用 expect 发送命令:
#!/usr/bin/expect
set password [lindex $argv 1]
spawn ssh -p 22 [lindex $argv 0]
expect "*password:*"
send -- "$password\r"
send -- "\r"
# expect the command prompt : change this if needed
expect "*$*"
# execute some commands
send -- "echo 'some text to write to some file' > ~/some_file.txt\r"
# exit vm
send -- "exit\r"
expect eof
你可以运行这个:
./create_config.sh david@machineA somePassword
你可以使用 sshfs:安装一台机器,做你想做的,卸载并传递给下一台。
我必须在特定目录下创建一个文件 functon.txt
,其中包含许多机器中的 hello world
。到目前为止,这就是我手动登录每个框并创建文件的操作。该目录归 root
所有,所以我必须确保新文件也归 root
用户所有。
david@machineA:~$ sudo su
[sudo] password for david:
root@machineA:/home/david# cd /opt/Potle/ouyt/wert/1
root@machineA:/opt/Potle/ouyt/wert/1# vi functon.txt
root@machineA:/opt/Potle/ouyt/wert/1# ssh david@machineB
david@machineB:~$ sudo su
[sudo] password for david:
root@machineB:/home/david# cd /opt/Potle/ouyt/wert/1
root@machineB:/opt/Potle/ouyt/wert/1# vi functon.txt
root@machineB:/opt/Potle/ouyt/wert/1# ssh david@machineC
.....
现在我必须在大约 200 台机器上执行此操作。有什么办法可以通过一些脚本来完成这些事情吗?如果必须的话,我可以多次输入密码,但我不想手动登录这些框并手动执行所有其他步骤。
我有一个文件 hosts.txt
,其中逐行包含每台机器。我可以逐行阅读此文件并执行上述操作,但我不确定如何操作?
这对我来说只是一次练习,所以任何简单或简单的方法都可以。我什至可以在脚本中硬编码我的密码来完成这项工作。完成此任务的最佳方法是什么?
安装 Ansible 后:
ansible -i /path/to/hosts.txt -m ping -u david --ask-pass all
看看能不能ping通机器。如果成功,则在 2 台机器上尝试以下操作(创建另一个只有 2 台机器的 txt 文件并将其传递给 -i
选项)。然后你可以 运行 这适用于所有机器。如果该目录不存在,命令将失败,您将看到失败的机器摘要。
ansible -i /path/to/hosts.txt -m copy -a "src=/path/to/functon.txt dest=/opt/Potle/ouyt/wert/1/functon.txt" -u david --ask-pass --become --become-user root --ask-become-pass all
我没有测试这个。所以谨慎使用。
-i
: 输入主机-m
: 模块-a
:模块参数-u
:用户--ask-pass
: 询问用户密码--become
: 成为另一个用户--become-user
: 新用户--ask-become-pass
: 要求成为用户密码
您可以使用 expect
自动执行 SSH 复制/SSH 登录:
#!/usr/bin/expect
set password [lindex $argv 1]
spawn scp -P 22 [lindex $argv 2] [lindex $argv 0]
expect "*password:*"
send -- "$password\r"
send -- "\r"
expect eof
expect
命令将等待您在参数中提供的字符串被接收。
您可以从 hosts.txt
和 运行 遍历您的主机,此脚本对每个主机都是这样的:
./create_config.sh david@machineA:/opt/Potle/ouyt/wert/1/ somePassword functon.txt
如果您无法进行 SSH 复制而只能进行 SSH,您仍然可以使用 expect 发送命令:
#!/usr/bin/expect
set password [lindex $argv 1]
spawn ssh -p 22 [lindex $argv 0]
expect "*password:*"
send -- "$password\r"
send -- "\r"
# expect the command prompt : change this if needed
expect "*$*"
# execute some commands
send -- "echo 'some text to write to some file' > ~/some_file.txt\r"
# exit vm
send -- "exit\r"
expect eof
你可以运行这个:
./create_config.sh david@machineA somePassword
你可以使用 sshfs:安装一台机器,做你想做的,卸载并传递给下一台。