我正在尝试通过Shell脚本自动执行类似于crontab编辑的命令的VI编辑,但到目前为止还没有为我工作。
这是管理员为真的最终json:
'{"name":"SQLSRVR","admin":"true","json_class":"Chef::ApiClient","chef_type":"client"}'
如您所见,必须将EDITOR环境变量设置或传递为命令行选项-e
[root@vrhost user]# knife client edit SQLSRVR
ERROR: RuntimeError: Please set EDITOR environment variable
[root@vrhost user]# knife client edit
USAGE: knife client edit CLIENT (options)
-s, --server-url URL Chef Server URL
-k, --key KEY API Client Key
--[no-]color Use colored output, defaults to enabled
-c, --config CONFIG The configuration file to use
--defaults Accept default values for all questions
-d, --disable-editing Do not open EDITOR, just accept the data as is
-e, --editor EDITOR Set the editor to use for interactive commands
-E, --environment ENVIRONMENT Set the Chef environment
-F, --format FORMAT Which format to use for output
-u, --user USER API Client Username
--print-after Show the data after a destructive operation
-V, --verbose More verbose output. Use twice for max verbosity
-v, --version Show chef version
-y, --yes Say yes to all prompts for confirmation
-h, --help Show this message
FATAL: You must specify a client name
以下命令打开一个vim编辑器进行编辑,以便从[“admin”:“false”]更改为[“admin”:“true”]:
[root@vrhost user]# knife client edit SQLSRVR -e vim
{
"name": "SQLSRVR",
"admin": false,
"json_class": "Chef::ApiClient",
"chef_type": "client",
}
我正在尝试通过shell脚本执行此操作,并希望自动化它并尝试了许多选项,但到目前为止没有运气。
[root@vrhost ~]# (echo ^[:g/false/s/false/true/^[:wq!^M) | knife client edit SQLSRVR -e vim
Vim: Warning: Input is not from a terminal
Object unchanged, not saving
或
[root@vrhost user]# echo (^[echo '{"name":"SQLSRVR","admin":"true","json_class":"Chef::ApiClient","chef_type":"client"}'^[:w q!^M) | knife client edit SQLSRVR -e
[root@vrhost ~]# knife client show SQLSRVR
admin: false
chef_type: client
json_class: Chef::ApiClient
name: SQLSRVR
这与通过shell脚本自动编辑crontab非常相似,但这对我来说并不适用。
答案 0 :(得分:1)
除非你真的需要特殊的Vim功能,否则最好使用非交互式工具,例如sed
,awk
或Perl / Python / Ruby / 这里你最喜欢的脚本语言
也就是说,您可以使用静默批处理模式以非交互方式使用Vim。
vim -T dumb --noplugin -n -es -S "commands.ex" "filespec"
您可以直接通过-S "commands.ex"
提供一些命令,而不是通过外部脚本来读取来自-c cmd1 -c cmd2
的命令。有关详细信息,请参阅:help -s-ex
。
答案 1 :(得分:0)
结帐
$ knife client edit --help
[...]
-d, --disable-editing Do not open EDITOR, just accept the data as is
所以我猜你可以在不修改vim的情况下更改值。只是:
代码:
$ knife client show -Fj SQLSRVR > SQLSRVR.json
$ sed -i.old "s/\"admin\": true,/\"admin\": false,/" SQLSRVR.json
$ knife client edit -d SQLSRVR < SQLSRVR.json
类似的东西。
答案 2 :(得分:0)
以下是一些参考链接:
i)http://mirror.hep.wisc.edu/stable/chef/chef-server-webui/app/controllers/clients_controller.rb
ii)http://www.rubydoc.info/github/opscode/chef/master/Shell/Extensions - 尝试但无法让它工作
最后做了以下事情(它确实给了409第二次电话,我不需要第二次这样做):
# call to below rb, CLIENTNAME is the name of the client and STATE is true/false
$ knife exec clienttransform.rb CLIENTNAME STATE
$ cat clienttransform.rb
Chef::Config[:solo] = false
class Company
class TransformClient
attr_accessor :clientname
attr_accessor :isclientadmin
def initialize(client_name, is_client_admin)
@clientname = client_name
@isclientadmin = is_client_admin
end
def transform
client=Chef::ApiClient.load(@clientname)
# puts "client.name : " + client.name
# puts "client.admin : " + client.admin.to_s
# puts "XX - clientname : " + @clientname
# puts "XX - isclientadmin : " + @isclientadmin.to_s
boolisclientadmin = !!@isclientadmin
client.admin(boolisclientadmin)
client.save()
end
end
end
client_name = ARGV[2].to_s()
is_client_admin = ARGV[3].to_s()
# puts "YY - client_name : " + client_name
# puts "YY - is_client_admin : " + is_client_admin
trc = Company::TransformClient.new(client_name, is_client_admin)
trc.transform
exit 0
答案 3 :(得分:0)
只需设置您的编辑器即可。在我的情况下,我使用vim编辑器,这就是为什么我的命令如下:
export EDITOR=vim