EMCLI Enterprise Manager 12c/13c : Ajout d'une base de données avec mot de passe avec des caractères spéciaux

L’outil ligne de commande (EMCLI) pour Enterprise Manager permet d’automatiser des opérations, notamment l’ajout de bases de données.
L’ajout d’une base de données avec un mot de passe de supervision contenant des caractères spéciaux pose problème.
Cet article présente la méthode pour gérer ce cas particulier.


Pour exécuter la commande « emcli add_target », il est nécessaire de se connecter :

sysman_password=""
emcli login -username=SYSMAN -password=${sysman_password}
emcli sync

La définition des propriétés est réalisée via des variables :

instance_name=
host_name=
dbhome_path=/opt/oracle/product/12.1/dbhome_1
instance_resname=${instance_name}_${host_name}
user_name=DBSNMP
user_role=Normal
listener_name=LISTENER_${instance_name}
listener_resname=LISTENER_${instance_name}_${host_name}
listener_port=1521
db_properties="SID:${instance_name}"
db_properties="${db_properties};Port:${listener_port}"
db_properties="${db_properties};OracleHome:${dbhome_path}"
db_properties="${db_properties};MachineName:${host_name}"
db_credentials="UserName:${user_name};password:;Role:${user_role}"
lsnr_properties="LsnrName:${listener_name}"
lsnr_properties="${lsnr_properties};ListenerOraDir:${dbhome_path}/network/admin"
lsnr_properties="${lsnr_properties};Port:${listener_port}"
lsnr_properties="${lsnr_properties};OracleHome:${dbhome_path}"
lsnr_properties="${lsnr_properties};Machine:${host_name}"

La commande « emcli add_target » prend normalement la forme suivante :

emcli add_target \
      -name="${instance_resname}" \
      -type="oracle_database" \
      -host="${host_name}" \
      -credentials="${db_credentials}" \
      -properties="${db_properties}"
      
Error: Cannot save the target to the agent
Missing Properties

Dans ce cas, le mot de passe avec des caractères spéciaux est ignoré.
Il faut modifier le mot de passe manuellement dans la console.
Pour gérer les mots avec des caractères spéciaux, il est nécessaire d’utiliser un fichier temporaire et d’utiliser la clause PWD_FILE.
Le mot de passe doit être entre double guillemets.

db_credentials="UserName:${user_name};password:PWD_FILE;Role:${user_role}"
input_file="PWD_FILE:/tmp/user_passwd.txt"
echo "\"\"" > /tmp/user_passwd.txt
emcli add_target \
      -name="${instance_resname}" \
      -type="oracle_database" \
      -host="${host_name}" \
      -credentials="${db_credentials}" \
      -properties="${db_properties}" \
      -input_file="${input_file}"
rm  /tmp/user_passwd.txt
emcli logout